bit_operation.cpp GitHub int ctz(int n) { int res = 0; if ((n & 0x0000ffff) == 0) n >>= 16, res += 16; if ((n & 0x000000ff) == 0) n >>= 8, res += 8; if ((n & 0x0000000f) == 0) n >>= 4, res += 4; if ((n & 0x00000003) == 0) n >>= 2, res += 2; if ((n & 0x00000001) == 0) n >>= 1, res += 1; return res; } int lg(int n) { int res = 1; --n; if (n >> 16) n >>= 16, res += 16; if (n >> 8) n >>= 8, res += 8; if (n >> 4) n >>= 4, res += 4; if (n >> 2) n >>= 2, res += 2; if (n >> 1) n >>= 1, res += 1; return res; } int lg(long long n) { int res = 1; --n; if (n >> 32) n >>= 32, res += 32; if (n >> 16) n >>= 16, res += 16; if (n >> 8) n >>= 8, res += 8; if (n >> 4) n >>= 4, res += 4; if (n >> 2) n >>= 2, res += 2; if (n >> 1) n >>= 1, res += 1; return res; } template <typename T> int log2ceil(T n) { return T(1) << lg(n); } Back