lowbit运算

lowbit(n) 定义为非负整数 n 在二进制表示下 "最低位的 1 及其后边所有的 0"构成的数值。例如:n=10 的二进制表示为 1010 ,则lowbit(n) = 2 =10(二进制)。

lowbit(n) 公式:lowbit(n) = n & (-n)

lowbit 运算配合 Hash 可以找出整数二进制表示下所有是1的位,所花费的时间与1的个数同级。

取 1 和 8 的对数 log1 和 log8 ,即可得知 n 的第 0 位和第 3 位是 1。因为C++math.h库的 log 函数是以 e 为底的实数运算,并且复杂度常数较大,所以我们需要预处理一个数组,通过 Hash 的方法代替 log 运算。

建立一个长度为 37 的数组 H ,令 H[2^k mod 37] = k。这里利用了一个小的数学技巧:任意 k 属于 [0,35],2^k mod 37 互不相等,且恰好取遍整数 1~36。

int H[37];
int n;
int
main() { for (int i = 0; i < 36; i++) H[(1ll << i) % 37] = i; while (cin >> n){ while (n>0){ cout << H[(n&-n)% 37] << ' '; n -= n&-n; } } return 0; }
//当输入n=10; H里面为 1 3 ,因为10的二进制为 1010

猜你喜欢

转载自www.cnblogs.com/looeyWei/p/10528003.html