zoukankan      html  css  js  c++  java
  • 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;
    }

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

  • 相关阅读:
    转:高并发场景下强一致预算/库存扣减方案
    转:Dubbo性能调优参数及原理
    转:java线程状态说明,Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
    使用增强学习法之SQ3R主动阅读
    建立实用投资计划
    使用smarty方法实现目标
    主动学习
    小知识
    大脑的处理模式
    真正的随笔
  • 原文地址:https://www.cnblogs.com/chuyds/p/10743508.html
Copyright © 2011-2022 走看看