【问题标题】:How a long data type will be stored in a memory?long 数据类型将在内存中存储多长时间?
【发布时间】:2013-02-23 17:06:49
【问题描述】:

我的需要:

对于任何非负无符号长a,

输入 a = 5; Ans 应该是 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 次移位就足以找到答案。

【问题讨论】:

  • 您确定需要担心那一点点速度吗?无论您使用什么来打印结果,都将花费更多时间来执行。

标签: c performance bit-manipulation bit-shift


【解决方案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;
}

【讨论】:

  • 没有。我将检查为 *p != 0 ,如果 no 小于 2^24,则此条件失败,因此我将检查下一个最高有效字节。对于较低的 n 值(如 1,2 等),find_msb 将太长...
【解决方案2】:

我认为您担心效率的方式。最坏的情况是 O(n),坦率地说,它永远不会变得更好。即使在处理器速度较慢的嵌入式系统中,也没有真正需要尝试加速 H2CO3 的算法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2014-03-10
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多