有一个相对知名的技巧可以取消设置最右边的一个位:
y = x & (x - 1) // 0b001011100 & 0b001011011 = 0b001011000 :)
Run Code Online (Sandbox Code Playgroud)
我发现自己有一个紧密的循环来清除最右边的 n 位,但是有更简单的代数技巧吗?
假设 n 相对较大(对于 64 位整数,n 必须小于 64,但通常约为 20-30)。
// x = 0b001011100 n=2
for (auto i=0; i<n; i++) x &= x - 1;
// x = 0b001010000
Run Code Online (Sandbox Code Playgroud)
我翻阅了 TAOCP Vol4 几次,但找不到任何灵感。
也许有一些硬件支持?