Java 位运算算法题目练习
汉明距离
题目解析:判断两个数的对应二进制位不同的个数。
直接判断 (x >> i) & 1 和 (y >> i) & 1,先获取对应二进制位,再判断是否相等即可。
class Solution {
public int hammingDistance(int x, int y) {
int count = 0;
// 从后向前依次取出二进制位,进行比较
for (int i = 0; i < 31; i++) {
if (((x >> i) & 1) != ((y >> i) & 1)) {
count++;
}
}
return count;
}
}
比特位计数
题目解析:给定一个数 n,从 [0, n] 中,找出每一个数对应的二进制位中 1 的个数,并将其放入一个长度为 (n+1) 的数组中。
暴力解法:因为 n & (n - 1) 每次都可以清除最右边的 1。这样每次遇到一个数,都进行这样的操作,直到这个数变成 0,才进行下一个数的计算。时间复杂度:O(n * log n)。
规律:一个正整数 x,右移一位,将会去掉最低位,变成 x / 2。 但是我们可以知道,如果 x 是偶数其 1 的个数和 x / 2 是一样的,因为后面都是 0;奇数的话就要 +1。
- 偶数:
bits[x] = bits[x >> 1] - 奇数:
bits[x] = bits[x >> 1] + 1
通过这种方法可以利用前面已经计算过的数据,不用像上面重复计算。时间复杂度:O(n)。
// 暴力解法
class Solution {
public int[] countBits(int n) {
int[] bits = new int[n + 1];
( ; i <= n; i++) {
;
i;
(x > ) {
x = x & (x - );
count++;
}
bits[i] = count;
}
bits;
}
}
{
[] countBits( n) {
[] bits = [n + ];
( ; i <= n; i++) {
bits[i] = bits[i >> ] + (i & );
}
bits;
}
}


