0. 常见位运算及操作简介
- & : 与运算,两个数全为1结果为1,否则结果为0
- | : 或运算,两个数全为0结果为0,否则结果为1
- ~:非运算,1变为0,0变为1
- ^:异或运算,相同为0,相异为1
- " >>" 和 “>>>” , 算术右移和逻辑右移,相当于除以2
A = 11111111111111111111111110000001
B = 2
A >> B = 11111111111111111111111111100000
A >>> B = 00111111111111111111111111100000
- “<<” 相当于乘以2
- 技巧一:n & (n-1) 去掉最后一位的1
- 技巧二: a ^ b ^b = a
- 技巧三: n & (-n) 得到最后一位的1
1. 求二进制中1的个数
题目:给出一个整数n,求其二进制表示中1的个数。
思路:1.每次根据技巧一去掉一位1,进行统计;2.定义一个mask与原数的每一位进行与运算
// 求一个数中1的个数
public static int numberOfOne1(int n){
// 此方法会改变输入数据的值
int cnt = 0;
while(n != 0){
cnt++;
//去掉最后一个1
n &= n-1;
}
return cnt;
}
//求一个数中1的个数
public static int numberOfOne2(int n){
// 此方法不会改变输入数据值
int cnt = 0;
int mask = 1;
while(mask != 0){
if((n & mask) != 0){
cnt ++;
}
mask <<= 1;
}
return cnt;
}
2. 判断一个数是否为2的幂或4的幂
题目:判断一个数是否为2的幂或者为4的幂
思路:1.如果为2的幂则二进制表示中1仅可出现一次;2.如果为4的幂,首先是2的幂,然后需要保证二进制中1的位置在偶数位上;
//判断一个数是否是2的幂
public static boolean isPowOfTwo(int n){
return (n != 0 && (n & (n - 1)) == 0);
}
//判断一个数是否是4的幂
public static boolean isPowOfFour(int n){
//先判断是否是2的幂
//然后判断1所在的位置是否在偶数位上
return ((n & (n - 1)) == 0) && n >0 && ((n &