借鑑大佬博客:http://blog.sina.com.cn/s/blog_60e96a410100mjd2.html
https://blog.csdn.net/fuhuixin7497/article/details/78037265
位運算
優先級別由高到低依次爲:按位取反( ~ ),按位與( & ),按位異或( ^ ),按位或( | )。
1)按位取反(~)
即0變1,1變0;
用途 生成與系統無關的常數
如:n=n&(~077) 將n的最低六位置0 (077二進制表示爲111111)
2)按位與(&)
0 & 0 = 1 0 & 1 = 0 1 & 0 = 0 1 & 1 =1
即同爲1時結果才爲1,否則結果爲0
用途 (1) lowbit(n) 用於計算n的二進制表示中最低位1出現的位置
int lowbit(int n){
return n&(-n);
}
(2) 計算n的二進制表示中又幾個1
int numOfOne(int n){
int count=0;
while(n){
count++;
n=n&(n-1);
}
return count;
}
當然還有另一種計算方法
int numOfOne(int n){
int count=0;
for(int i=0;i<32;i++){
if(n>>i&1) count++;
}
return 0;
}
(3)可以用來截取n的最低幾位
如: n&0177 (截取最低7位)
n&077(截取最低六位)
當然 只要找好常數截哪裏都不是問題~~~
3)按位異或(^)
0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0
即不同爲1,相同爲0
用途 題目有時會要求異或,在博弈論中的尼姆博弈中會用到
4)按位或(|)
0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1
即只要有1出現結果就是1,否則爲0
用途 (1) 將n的二進制中的某幾位置1
如: n=n | 017 (將低4位置1)
(2) 取n的二進制位0的個數(高位補0)
int numOfZero(int n){
int count=0;
while(n+1){
count++;
n=n|(n+1);
}
return count;
}
當然有另一種方法
int numOfZero(int n){
int count=0;
for(int i=0;i<32;i++){
if(!(n>>i&1))count++;
}
return 0;
}
如果想分別求出n的二進制表達中1的個數和0的個數(不包括高位) 怎麼辦呢?~
int numOf(int n){
int count1=0,count2=0;
while(n){
if(n&1) count1++;//1的個數
else count2++;//0的個數
n>>=1;
}
}
over~~~