位运算介绍
位运算(&、|、^、~、>>、<<):从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算。
用法
- 判断两个数是否异号
int x = -1, y = 2;
bool f = ((x ^ y) < 0); // true
int x = 3, y = 2;
bool f = ((x ^ y) < 0); // false
这个技巧还是很实用的,利用的是补码编码的符号位。如果不用位运算来判断是否异号,需要使用 if else 分支,还挺麻烦的。读者可能想利用乘积或者商来判断两个数是否异号,但是这种处理方式可能造成溢出,从而出现错误。
- 消除数字 n 的二进制表示中的最后一个 1
n & (n-1)
其核心逻辑就是,n - 1 一定可以消除最后一个 1,同时把其后的 0 都变成 1,这样再和 n 做一次 & 运算,就可以仅仅把最后一个 1 变成 0 了。
典型例题
- 【力扣-191. 位1的个数】
public int hammingWeight(int n) {
int ans = 0;
while(n != 0) {
n = n & (n-1);
ans++;
}
return ans;
}
- 【力扣-136. 只出现一次的数字】
// 用位运算的知识,本题利用异或运算
class Solution {
public int singleNumber(int[] nums) {
int pro = nums[0];
for (int i=1; i<nums.length; i++) {
pro ^= nums[i];
}
return pro;
}
}