PS:本帖记录一些在刷题过程中的作用与技巧。
1.位运算(与运算)判断奇偶
num & 1 == 1 : 判断为奇数;
num & 1 == 0 : 判断为偶数。
2.位运算(异或运算)交换 两个数的值。
a = a^b;
b = a^b;
a = a^b;
3.位运算(异或运算)找到数组中出现一次的数
class Solution {
public:
void FindNumsAppearOnce(vector<int> data, int* num1, int* num2) {
int length = data.size();
if (length == 2) {
*num1 = data[0];
*num2 = data[1];
return;
}
int bitResult = 0;
for (int i = 0; i < length; ++i) {
bitResult ^= data[i]; // 全体异或
}
int index = findFirst1(bitResult); // 找到第一个位为1的数
for (int i = 0; i < length; ++i) {
if (isBit1(data[i], index)) { // 查看当前数的index位是不是1
*num1 ^= data[i];
}
else {
*num2 ^= data[i];
}
}
}
int findFirst1(int bitResult) {
int index = 0; // 注意这里是第0 位开始,java是第一位
while ((bitResult & 1) == 0 && index < 32) { // 找到第一位1
bitResult >>= 1; // 右移一位
index++;
}
return index;
}
bool isBit1(int target, int index) {
return ((target >> index) & 1) == 1;
}
};
4.位运算求整数的绝对值
abs(num) = (num ^ (num >> 31)) - (num >> 31) (注:本人太菜,这里就不推导了)
5.位运算(异或、与运算)实现加法(例:不使用加法实现两数相加)
class Solution {
public:
int Add(int num1, int num2)
{
while (num2 != 0) { // 进位值为0 跳出循环
int temp = num1 ^ num2; // 得到二进制的相加
num2 = (num1 & num2) << 1; // 得到二进制的进位
num1 = temp;
}
return num1;
}
};
6.位运算和二进制的一些操作