lowbit( )运算
--------开始--------
lowbit (n) 定义为非负整数n在二进制表示下“最低位的1及其后面所有的0构成的数值。
比如: n = 10 的二进制下为1010,则lowbit (n) = (10)2 = 2
实现:
对于任意一个整数实现lowbit ( ) 运算是类似的,为了更加直观,这里用整数20举例,20的二进制为:10100 设最后面的1所在的位置为k(从右向左计数) 然后首先对20取反,即~20:01011 此时会发现第k为变成了0,而0 ~ k - 1 为变成了1,然后再加1,变成01100,最后拿加1后的数和最开始的整数进行&运算就是我们要计算的结果 20:1 0 1 0 0
& ~20 + 1:0 1 1 0 0
----------------------------------------
0 0 1 0 0
第k位前面的数通过变化后和刚开始的数是完全相反的,所以最后不会影响结果,而只有第k位是1,k位后面都是0
仔细观察会发现:
lowbit (n) = n & (~n + 1) = n & (- n)
就是正整数n和它的负数n进行 & 运算
lowbit ( ) 运算比较方便,我们可以统计一个整数二进制中1所在的位置,最简单的方法就是建立一个数组 a,初始化数组a的元素为a [2k] = k
#include <iostream>
using namespace std;
const int max = 1 << 20;
int n, a[max];
int main()
{
for (int i = 0; i <= 20; i++)
a[1 << i] = i;
cin >> n;
while (n)
{
int s = n & -n;
cout << a[s] << " ";
n -= n & -n;
}
//system("pause");
return 0;
}
--------结束--------