前言
计算机位运算是处理整数值的基本操作,直接在二进制位上进行操作。理解位运算的要点对于编程和优化代码非常有用。
常见操作
与、或、非、异或、左移、右移
1. 基本位运算操作
与运算(AND)
&
- 将两个数的对应位进行逻辑与操作。
- 例子:
0101 & 0011 = 0001
或运算(OR)
|
- 将两个数的对应位进行逻辑或操作。
- 例子:
0101 | 0011 = 0111
异或运算(XOR)
^
- 将两个数的对应位进行逻辑异或操作,不同则为1,相同则为0。
- 例子:
0101 ^ 0011 = 0110
非运算(NOT)
~
- 将一个数的所有位取反(0变1,1变0)。
- 例子:
~0101 = 1010
(假设4位操作)左移运算(Shift Left)
<<
- 将一个数的所有位向左移动,右边补0。
- 例子:
0101 << 1 = 1010
右移运算(Shift Right)
>>
- 将一个数的所有位向右移动,左边补符号位(对于有符号数)或0(对于无符号数)。
- 例子:
0101 >> 1 = 0010
拓展应用
-
异或规则:
x^x=0
0^x=x
-
长度为n的掩码:
(1>>n)-1
-
数字x移除特定位n:1移动特定位取非后与
x&~(1<<n)
-
数字x翻转特定位n:特定位异或1翻转
x^(1<<n)
-
比特位x翻转:
x^1
-
数字x取非:
~x
-
数字x不存在连续的bit位为1:错位后与是否为0
(x&(x>>1))==0
-
字符串字符比特位标记:bitArray为转换后的数字,c为当前的字符
bitArray|=1<<(c-'a')
-
一个字符串是否包含另一个字符串:字符串转换成对应数字后比较
bitArray_1&bitArray_2=bitArray_1
-
数字i转换为n+1位的二进制比特位字符,避免高位为0丢弃。
Integer.toBinaryString((1 << n) | i)
-
清整数number的最后位比特位
number=number&(number-1)
- 枚举集合子集元素集合总数,0为空集,(1<<n)-1为全集。
[0,1<<n)
- 数字i中对应比特位j是否为1
(i&(1<<j))==(1<<j)
- bit位逐步比较
public static int countBits(int number) {
int count = 0;
while (number != 0) {
count += number & 1; // Check the least significant bit
number >>= 1; // Right shift by 1
}
return count;
}
- bit位尾数清零
public static int countBits(int number) {
int count = 0;
while (number != 0) {
number &= (number - 1);
count++;
}
return count;
}
- 判断一个数是否是2的幂(只有一个bit位为1)
boolean isPowerOfTwo(int x) {
return x > 0 && (x & (x - 1)) == 0;
}