长数据类型如何存储在内存中?

时间:2013-02-23 17:06:49

标签: c performance bit-manipulation bit-shift

我的需要:

对于任何非负无符号长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个移位就足以找到答案。

2 个答案:

答案 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的算法。

让它工作,然后担心效率。