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

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

  • 相关阅读:
    关于DOS的常用操作
    <leetcode 第188场周赛>
    大挑战!状压dp!
    41. 缺失的第一个正数
    1095. 山脉数组中查找目标值 (二分查找)
    “人活着就是为了贪心”——贪心算法日
    二分查找
    2020.4.25 leetcode 编程战队赛
    <leetcode c++>221. 最大正方形
    <leetcode c++>面试题51. 数组中的逆序对
  • 原文地址:https://www.cnblogs.com/chuyds/p/10743508.html
Copyright © 2011-2022 走看看