lowbit() 运算

Posted willendless

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lowbit() 运算相关的知识,希望对你有一定的参考价值。

【算法】

  lowbit()运算取出非负整数n二进制表示下最低位的1及其后的0表示的值:

    对n按位取反后加1(即补码操作,-n),最低位1即其后位的表示不变,而之前的每一位均取反了,于是按位与即得到所需的值。

    

(~n + 1) & n 等价于 (-n) & n

  

【应用】

  1.树状数组

  2.配合Hash找出n二进制表示下为1的位

 1 #include <bits/stdc++.h>
 2 #define MAX_N  1<<20
 3 using namespace std;
 4 int n;
 5 int H[MAX_N + 1];
 6 int main()
 7 {
 8     for(int i = 0; i <= 20; i++)
 9         H[i << 1] = i;   //2的i次方下标处存i,预处理
10     while(cin >> n) {
11         while(n > 0) {
12             cout << H[n & -n] <<  ;
13             n -= n & -n;
14         }
15     }
16     return 0;
17 }

 

以上是关于lowbit() 运算的主要内容,如果未能解决你的问题,请参考以下文章

关于二进制——lowbit运算

lowbit() 运算

位运算AcWing 801. 二进制中1的个数(lowbit)

[E位运算] lc191. 位1的个数(位运算+lowbit()+水题)

51nod 3216位运算(lowbit)授勋

51nod 3216位运算(lowbit)授勋