如何取消设置单词的最高有效位(例如0x00556844-> 0x00156844)? gcc中有一个__builtin_clz,但它只计算零,这对我来说是不需要的。另外,对于MSVC或Intel C编译器,应如何替换__builtin_clz?

目前我的代码是

 int msb = 1<< ((sizeof(int)*8)-__builtin_clz(input)-1);
 int result = input & ~msb;

更新:好的,如果您说这段代码相当快,我会问您,我应该如何在此代码中添加可移植性?此版本适用于GCC,但是MSVC和ICC吗?

最佳答案

只需四舍五入到最接近的2的幂,然后将其与原始值进行异或,例如使用Hacker's Delight中的flp2():

uint32_t flp2(uint32_t x) // round x down to nearest power of 2
{
    x = x | (x >> 1);
    x = x | (x >> 2);
    x = x | (x >> 4);
    x = x | (x >> 8);
    x = x | (x >>16);
    return x - (x >> 1);
}

uint32_t clr_msb(uint32_t x) // clear most significant set bit in x
{
    msb = flp2(x);  // get MS set bit in x
    return x ^ msb; // XOR MS set bit to clear it
}

关于c - 取消设置单词中的最高有效位(int32)[C],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6011165/

10-11 15:51