我处在这种独特的情况下,搜索“最重要的位”会产生太多结果,而我无法找到符合我需求的答案!
问题本身很简单:“如何在无符号长整型中找到最重要的设置位?”当我进行计算时,最右边的位是位置'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
}
答案 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