如何取消设置单词的最高有效位(例如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/