位运算是在计算机底层非常常用的一种操作。在算法中,位运算常常用于快速计算,尤其是那些与二进制操作相关的问题。下面是一些常见的位运算操作、代码模板及详细注释:
设置某一位为1
function setBit(num, i) {
return num | (1 << i);
}
console.log(setBit(5, 2)); // 5的二进制表示为101,设置第2位为1后得到111,即7
清除某一位
function clearBit(num, i) {
return num & ~(1 << i);
}
console.log(clearBit(7, 2)); // 7的二进制表示为111,将第2位清除后得到011,即3
切换某一位的值
function toggleBit(num, i) {
return num ^ (1 << i);
}
console.log(toggleBit(5, 1)); // 5的二进制表示为101,切换第1位后得到111,即7
检查某一位是0还是1
function getBit(num, i) {
return (num & (1 << i)) !== 0;
}
console.log(getBit(5, 1)); // 5的二进制表示为101,第1位是0,所以返回false
常见题型:
- 单数出现的数字:给你一个整数数组,除一个数字外其余每个数字均出现两次,找到那个只出现一次的数字。
- 不使用算术运算符实现加法:给你两个整数,不使用算术运算符返回它们的和。
- 位1的个数:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数。
- 翻转位:颠倒给定的32位无符号整数的二进制位。
- 2的幂:给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
使用位运算可以高效地解决这些问题,通常时间复杂度为O(1)或O(n)。