noM*_*MAD 3 c bit-manipulation
所以我想切换我的号码中最重要的一点.这是一个例子:
x = 100101 then answer should be 00101
Run Code Online (Sandbox Code Playgroud)
我有一台64位机器,因此我不希望答案是100000..<51 0's>..100101
我想到的一种方法是计算我的数字中的位数,然后切换MSB,但不知道如何计数.
作弊是将其典当给编译器:在大多数CPU中有指令用于这样的工作.
以下应该做你想要的.
i ^ (1 << (sizeof i * CHAR_BIT - clz(i) - 1))
Run Code Online (Sandbox Code Playgroud)
这将转换为CLZ指令,该指令计算前导零.
对于海湾合作委员会,请参阅:http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Other-Builtins.html
需要注意的一件事是,如果这导致未定义的行为i == 0.
您应该用clz()编译器的正确内在替换,在GCC中这是__builtin_clz; 在Visual Studio C++中这是_BitScanForward.