今天看树状数组,突然发现了这个东西,想了一想,然后用文字简要的证明了一下:
2^k = L and (L xor (L - 1) )
设i在二进制下从末尾数的第 k 位第一次不为0.
先用 c = i^(i-1)则将第 k 位以左的数变为0,从k位往右都为1
再用 i & c 因为c的末尾 k位为1,k位以左为0,i的末尾 k-1位为0,第k位为1,k位以左不知道。
按位与后则剩余的数即为 2^(k - 1)
下面是程序:
#include <stdio.h>
#include <math.h>
#define NUM 16
//lowbit:计算当 i 在二进制下整数 末尾0的个数为k时求2^k 即 2^k = lowBit(i)
//设i