如何取消设置一个字的最高有效位(例如 0x00556844 -> 0x00156844)?有一个__builtin_clz
在 gcc 中,但它只计算零,这对我来说是不需要的。另外,我应该如何替换 msvc 或 intel c 编译器的 __builtin_clz ?
目前我的代码是
int msb = 1<< ((sizeof(int)*8)-__builtin_clz(input)-1);
int result = input & ~msb;
更新:好的,如果你说这段代码相当快,我会问你,我应该如何为这段代码添加可移植性?这个版本是针对GCC的,但是MSVC & ICC呢?
只需向下舍入到最接近的 2 次方,然后将其与原始值进行异或,例如使用flp2()
from 黑客的喜悦:
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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)