找出最重要的设置位

时间:2013-09-22 03:33:34

标签: c bit-manipulation bit-shift bits

我处在这种独特的情况下,搜索“最重要的位”会产生太多结果,而我无法找到符合我需求的答案!

问题本身很简单:“如何在无符号长整型中找到最重要的设置位?”当我进行计算时,最右边的位是位置'0'。

我知道它涉及屏蔽最低位,检查然后向左移动一次,同时递增计数,然后重复第二低位等等。

我以前做过这个,但无论出于什么原因我现在都做不到。


编辑:“最重要”是指最左边的位置,对不起任何混淆!*


以下是我的功能解决方案和一些测试用例:

#include <stdio.h>

int findExponent( unsigned long L ){

    int exponent = -1;

    unsigned long shift = L;

    while( 0 != shift )
        exponent++, shift >>=1;

    if ( exponent >= 0 )
        printf("The most significant bit of L is at position %d\n", exponent);
    else{
        exponent = 0;
        printf("L is zero\n");
    }
    return exponent;
}


int main(int argc, char** argv){

    long check = 8L;

    findExponent( check );//2
    findExponent( 21421L );//14
    findExponent( 0L );//(is zero)
    findExponent( 1L );//0
}

3 个答案:

答案 0 :(得分:4)

  

“如何在无符号长整型中找到最重要的位?”

你可以向右移动,直到最后一个被下垂。此时,该值变为0.

#include <stdio.h>
int main(void) {
          unsigned long x = 3333;
          unsigned long y = x;
          int p = -1;
          while (0 != y)
              p++, y >>= 1;
          if (p >= 0)
              printf("The most significative bit of x is at position %d\n", p);
          else
              printf("x is zero\n");
}

答案 1 :(得分:0)

执行左移直到有符号值小于0(if ((signed long)x < 0)),然后从MSb位置值中减去执行的移位次数(或者只是递减)。

答案 2 :(得分:-1)

unsigned long x = val & ((~0ULL >> 1) ^ (~0ULL));

当然,如果值已签名,则所有负数在最有意义的位中都有一个,否则为零:)

在8位示例中向右移位和向前移动...

0011 1100 -> val
1111 1111 -> (~0)
0111 1111 -> (~0 >> 1)
1000 0000 -> ((~0 >> 1) ^ (~0))
0000 0000 -> val & ((~0 >> 1) ^ (~0))  !most significant bit from val is zero