文章目录
位运算常见问题
191.位1的个数
解法一:
利用x&1返回最低位是否为1
,不断的左移1
从最低位一个1开始与,如果不为0计数加1
public class Solution {
public int hammingWeight(int n) {
int x = 1;
int count = 0;
for (int i = 0; i < 32; i++) {
if ((n & x) != 0) {
//和某位的一个1进行与操作,如果不为0则存在1,计数+1
count++;
}
x = x << 1;//左移一位
}
return count;
}
}
解法二:
利用x&(x-1)
去掉最后一位1,判断如果去掉最后一位后为0了可以提前结束,去掉了多少次就去掉了多少个0
public class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int count = 0;
while (n != 0) {
count++;
n &= (n - 1);
}
return count;
}
}
231.2的幂
2的幂值都满足只有一个1
只有一个1的不一定是2的幂值,排除一个数-2147483648 即 Integer.MIN_VALUE
,它的二进制是1个1和31个0,1代表符号位
采用x&(x-1)
去除掉最低位的1,如果x&(x-1) == 0则只有一个1是2的幂
public class Solution {
public boolean isPowerOfTwo(int n) {
return n != 0 && n != Integer.MIN_VALUE && (n & (n - 1)) == 0;
}
}
342.4的幂
与2的幂一样,只有一个1,并且这个1的位置是固定的,是偶数位
所以还需要剔除下在 奇数位的值
0xaaaaaaaa = 0b10101010101010101010101010101010
只要1的位置全为0,则不符合
public class Solution {
public boolean isPowerOfFour(int num) {
return num != 0 && (num & (num - 1)) == 0 && (0xaaaaaaaa & num) == 0;
}
}
190.颠倒二进制位
思路:返回结果初始化全0,从最低位开始判断每一位是否为0,如果不为0将返回值的31-i位设置为1
public class Solution {
public int reverseBits(int n) {
int x = 1;//用来&操作的变量
int res = 0;//初始化全0
for (int i