理解位运算的规则

位运算的性质

位运算的性质包括:

  1. 位运算是基于二进制的运算,对于整数的每一位进行操作。
  2. 位运算是快速的,因为计算机底层对于位运算有专门的硬件支持。
  3. 位运算是不可逆的,即不能通过位运算的结果反推出原始的数值。
  4. 位运算可以高效地进行一些特定的操作,如判断奇偶性、求平均值、取绝对值等。
  5. 位运算可以用于压缩存储,通过位运算可以将多个布尔值压缩成一个整数。
  6. 位运算可以用于位掩码操作,通过位运算可以将某些位设置为1或者0,从而实现对特定位的操作。
  7. 位运算可以用于加密和解密操作,通过位运算可以对数据进行加密和解密处理。
  8. 位运算可以用于性能优化,通过位运算可以将一些复杂的运算转化为简单的位运算,从而提高程序的执行效率。

位运算有以下几个常见的规律:(参考离散数学和电子电路基础)

  1. 德摩根定律(De Morgan’s Laws):对于任意两个布尔表达式A和B,德摩根定律表示取反操作对于与运算和或运算是分配律的。具体表达式如下:

    • 非(A 和 B) = 非A 或 非B
    • 非(A 或 B) = 非A 和 非B
  2. 与运算规律:

    • A 和 0 = 0
    • A 和 1 = A
    • A 和 A = A
    • A 和 非A = 0
  3. 或运算规律:

    • A 或 0 = A
    • A 或 1 = 1
    • A 或 A = A
    • A 或 非A = 1
  4. 异或运算规律:

    • A 异或 0 = A
    • A 异或 1 = 非A
    • A 异或 A = 0
    • A 异或 非A = 1
  5. 移位运算规律:

    • 左移运算(<<)将二进制数向左移动n位,相当于乘以2的n次方。
    • 右移运算(>>)将二进制数向右移动n位,相当于除以2的n次方。
  6. 位操作规律:

    • 与操作和异或操作具有交换律和结合律,即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);
}
  1. 清零(将某一位设置为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
:::

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值