借鉴大佬博客: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~~~