二进制运算
最后更新于
最后更新于
public int singleNumber(int[] nums) {
// 10 ^ 10 == 00
// 两个相同的数异或变成0
int result = 0;
for (int n : nums) {
result = result ^ n;
}
return result;
}public int singleNumber(int[] nums) {
int result = 0;
// 统计每位1的个数
for (int i = 0; i < 64; i++) {
int sum = 0;
for (int n : nums) {
// 统计1的个数
sum += ((n >> i) & 1);
}
// 还原
result |= ((sum % 3) << i);
}
return result;
}public int[] singleNumber(int[] nums) {
// 关键点怎么把a^b分成两部分,方案:可以通过diff最后一个1区分
int diff = 0;
for (int n : nums) {
diff ^= n;
}
int[] result = new int[]{diff, diff};
// 去掉末尾的1后异或diff就得到最后一个1的位置
diff = (diff & (diff - 1)) ^ diff;
for (int n : nums) {
if ((diff & n) == 0) {
result[0] ^= n;
} else {
result[1] ^= n;
}
}
return result;
}public int hammingWeight(int n) {
int result = 0;
while (n != 0) {
if ((n & 1) == 1) result++;
n = n >>> 1;
}
return result;
}public int reverseBits(int n) {
int result = 0;
int p = 31;
while (n != 0) {
result += ((n & 1) << p);
n >>>= 1;
p--;
}
return result;
}public int rangeBitwiseAnd(int m, int n) {
while (m < n) {
// 抹去最右边的 1
n = n & (n - 1);
}
return n;
}