0

我处于独特的情况,搜索“最重要的位”会产生太多结果,而我找不到适合我需要的答案!

问题本身很简单:“如何在无符号长整数中找到最重要的设置位?” 当我进行计算时,最右边的位位置是位置“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
}
4

3 回答 3

4

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

您可以向右移动,直到最后一个 1 被删除。此时,值变为 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");
}
于 2013-09-22T04:00:55.820 回答
0

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

于 2013-09-22T03:36:26.727 回答
-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
于 2017-07-08T02:46:13.113 回答