我的需要:
对于任何非负无符号长a,
输入a = 5;答应该是3
输入a = 12;答应该是4
输入a = 1;答应该是1
输入a = 0 Ans应为0
即从左边找到最重要的1个位置。
我尝试了什么:
int count = 0;
if( a!=0 )
do{
count++;
}while( a >>= 1 );
问题 因为while循环和移位需要更多时间。
建议的方法 如果我知道4个字节是如何存储在内存中的(使用char *),我将取出包含最重要1的字节,因此在最坏的情况下,最多8个移位就足以找到答案。
答案 0 :(得分:1)
不要那样做。如果最重要的字节不包含您要查找的位(即,如果您的数字小于2 ^ (3 * CHAR_BIT)
),则您的方法将无效。你为什么不从另一端开始?
unsigned find_msb(unsigned long long n)
{
int bits_max = sizeof(n) * CHAR_BIT - 1;
int i;
for (i = bits_max; i >= 0; i--) {
if ((n >> i) & 1) return i + 1;
}
return 0;
}
答案 1 :(得分:1)
我认为你是担心效率的方式。最坏的情况是O(n),坦率地说,它永远不会变得更好。即使在慢速处理器上的嵌入式系统中,也没有必要尝试加速H2CO3的算法。
让它工作,然后担心效率。