程式競賽——位運算常用操作
阿新 • • 發佈:2021-10-24
位運算
&
與
|
或
~
非
^
異或
>>
右移
<<
左移
常用操作:
(1) 求x的第k位數字 x >> k & 1
(2) lowbit(x) = x & -x
,返回x的最後一位1
求整數的二進位制數表示中的第k位是幾?
n = 15 =(1111)2 :從0位開始的(右到左)
- 先把第k位移到最後一位 n >> k (將第k位移到了個位上)
- 看個位是幾 x&1
總結:1、2彙總: n >> k & 1
int n = 10;// 1010 for(int k = 3;k >= 0; k--)// 4位數的二進位制數 cout<< (n >> k & 1); // 1010
lowbit(x):返回x的最後一位1
lowbit()函式用來取一個二進位制最低位的1與後邊的0組成的數。
應用:統計x中1的個數(每次把最後一個1去掉)
x = 1010 lowbit(x) = 10
x= 101000 lowbit(x) = 1000
實現原理:x & -x
= x & (~x + 1)
,負數的補碼:原碼取反加一。利用了負整數的補碼特性
【例題】acwing801. 二進位制中1的個數
【方法一】傳統思路:先將十進位制數轉為二進位制數,然後統計出現1的個數(遍歷判斷)
#include<iostream> using namespace std; const int N = 100000+10; int q[N]; // 將十進位制數轉為二進位制數並統計1的個數 int count(int n) { int k = 0, ans = 0; while(n != 0) { q[k++] = n % 2; n = n / 2; } for(k--; k >= 0; k--) { if(q[k] == 1) ans++; } return ans; } int main() { int n; cin>>n; while(n--) { int x; cin>>x; cout<<count(x)<<" "; } return 0; }
【方法二】位運算
#include<iostream> using namespace std; int lowbit(int x) { return x & (-x); } int main(){ int n; cin>>n; while(n--) { int x; int res = 0; cin>>x; while(x) { x -= lowbit(x); // 減去每一次的最後一位1 res++; } cout<<res<<" "; } return 0; }
總結:
求n的第k位數字: n >> k & 1
。
返回n的最後一位1:lowbit(x) = x & -x
。應用:求某一個數的二進位制有多少位1。
注:如果文章有任何錯誤或不足,請各位大佬盡情指出,評論留言留下您寶貴的建議!如果這篇文章對你有些許幫助,希望可愛親切的您點個贊推薦一手,非常感謝啦