码迷,mamicode.com
首页 > 其他好文 > 详细

lowbit() 运算

时间:2018-07-14 14:43:28      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:树状   按位取反   amp   class   cpp   its   算法   define   mes   

【算法】

  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() 运算

标签:树状   按位取反   amp   class   cpp   its   算法   define   mes   

原文地址:https://www.cnblogs.com/Willendless/p/9309343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!