位运算的性质
位运算的性质包括:
- 位运算是基于二进制的运算,对于整数的每一位进行操作。
- 位运算是快速的,因为计算机底层对于位运算有专门的硬件支持。
- 位运算是不可逆的,即不能通过位运算的结果反推出原始的数值。
- 位运算可以高效地进行一些特定的操作,如判断奇偶性、求平均值、取绝对值等。
- 位运算可以用于压缩存储,通过位运算可以将多个布尔值压缩成一个整数。
- 位运算可以用于位掩码操作,通过位运算可以将某些位设置为1或者0,从而实现对特定位的操作。
- 位运算可以用于加密和解密操作,通过位运算可以对数据进行加密和解密处理。
- 位运算可以用于性能优化,通过位运算可以将一些复杂的运算转化为简单的位运算,从而提高程序的执行效率。
位运算有以下几个常见的规律:(参考离散数学和电子电路基础)
德摩根定律(De Morgan’s Laws):对于任意两个布尔表达式A和B,德摩根定律表示取反操作对于与运算和或运算是分配律的。具体表达式如下:
- 非(A 和 B) = 非A 或 非B
- 非(A 或 B) = 非A 和 非B
与运算规律:
- A 和 0 = 0
- A 和 1 = A
- A 和 A = A
- A 和 非A = 0
或运算规律:
- A 或 0 = A
- A 或 1 = 1
- A 或 A = A
- A 或 非A = 1
异或运算规律:
- A 异或 0 = A
- A 异或 1 = 非A
- A 异或 A = 0
- A 异或 非A = 1
移位运算规律:
- 左移运算(<<)将二进制数向左移动n位,相当于乘以2的n次方。
- 右移运算(>>)将二进制数向右移动n位,相当于除以2的n次方。
位操作规律:
- 与操作和异或操作具有交换律和结合律,即A 和 B = B 和 A,A 异或 B = B 异或 A,(A 和 B) 和 C = A 和 (B 和 C),(A 异或 B) 异或 C = A 异或 (B 异或 C)。
这些规律在位运算中经常被使用,可以帮助简化运算和优化算法。
代码块
这段代码是一个获取数字num的第i位的方法。首先,将数字1左移i位,得到一个只有第i位为1的数。然后,将这个数与num进行位与操作,将num的其他位都清零。最后,检查结果是否为0,如果不为0,则说明第i位为1,否则第i位为0。
这个方法的返回值类型是boolean,表示第i位的值是1还是0。参数num是要获取位的数字,参数i是要获取的位的索引。
例如,如果num的二进制表示是101101,那么getBit(num, 3)的返回值就是true,因为第3位是1。而getBit(num, 1)的返回值就是false,因为第1位是0。
boolean getBit(int num,int i){
return ((num&(1<<i))!=0);
}
2.设置(将某一位设置为1) setBit先将1左移i位,得到形如00010000的值,接着堆这个值和num执行”位或“操作,这样只会改变i位的数据。这样除i位外的位均为零,故不会影响num的其余位。代码如下:
int setBit(int num,int i){
return num |(1<<i);
}
- 清零(将某一位设置为0)
该方法与setBit相反,首先将1左移i位获得形如00010000的值,对这个值取反进而得到类似11101111的值,接着对该值和num执行”位与“,故而不会影响到num的其余位,只会清零i位。
int clearBit(int num, int i) {
int mask = ~(1 << i);
return num & mask;
}
4.更新
这个方法是将setBit和clearBit合二为一,首先用诸如11101111的值将num的第i位清零。接着将待写入值v左移i位,得到一个i位为v但其余位都为0的数。最后对之前的结果执行”位或“操作,v为1这num的i位更新为1
int updateBit(int num, int i, int v) {
int mask = ~(1 << i);
num = num & mask; // 清零第i位
v = v << i; // 将待写入值v左移i位
return num | v; // 对之前的结果执行位或操作
}
:::info
:::