末尾に続く0の数 Count Trailing Zeros
#ビット演算 で、値の末尾から続く0のビットの数を数えたい。 組み込み関数を使う
code:c++
__builtin_ctzll(x)
__builtin_ctz(x)
_tzcnt_u64(x)
_tzcnt_u32(x)
ビット演算で書く
code: c++
popcount((x & -x) - 1)
popcount(~x & (x - 1))
2の補数や引き算を使って下位の0のビットを浮き上がらせている x = 0b01110100として、(x & -x) - 1を考える
-x = 0b10001100
x & -x = 0b00000100
(x & -x) - 1 = 0b00000011
また、~x & (x - 1)は
~x = 0b10001011
x - 1 = 0b01110011
~x & (x - 1) = 0b00000011