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;
}

 

 

--------结束--------

posted @ 2019-04-21 00:14  chuyds  阅读(363)  评论(0编辑  收藏  举报