位运算与(&)、或(|)、非(~)、异或(^)、左移(<<)、右移(>>)

  1. 与运算(&)
    • 定义:与运算(&)是一种逻辑运算符,它对两个二进制位进行操作。当两个对应的二进制位都为 1 时,结果位才为 1,否则为 0。
    • 示例
      • 假设我们有两个整数,分别是 5 和 3。5 的二进制表示是 101,3 的二进制表示是 011。
      • 进行与运算:
        • 101&011,从右往左计算,第一位是 1&1 = 1;第二位是 0&1 = 0;第三位是 1&0 = 0。
        • 所以结果是 001,转换为十进制就是 1。
    • 用途
      • 用于位屏蔽。例如,要获取一个整数的某些特定位的值,可以通过与一个特定的掩码进行与运算。如果想要获取一个字节(8 位)数据的低 4 位,可以将这个字节与 00001111 进行与运算。
      • 检查某些位是否为 1。比如在权限控制中,不同的位可能代表不同的权限,通过与运算可以检查特定权限位是否被设置。
  2. 或运算(|)
    • 定义:或运算(|)也是一种逻辑运算符。当两个对应的二进制位中有一个为 1 时,结果位就为 1,只有当两个二进制位都为 0 时,结果位才为 0。
    • 示例
      • 还是以 5(101)和 3(011)为例。
      • 进行或运算:
        • 101|011,从右往左计算,第一位是 1|1 = 1;第二位是 0|1 = 1;第三位是 1|0 = 1。
        • 所以结果是 111,转换为十进制就是 7。
    • 用途
      • 用于设置某些位。例如,要将一个字节数据的某些位置 1,可以通过或运算与一个特定的掩码进行操作。如果要将一个字节的低 4 位设置为 1,可以将这个字节与 00001111 进行或运算。
      • 合并多个条件。在编程中,有时候需要判断多个条件是否满足其中一个,就可以使用或运算来组合这些条件。
  3. 非运算(~)
    • 定义:非运算(~)是一元运算符,它对一个二进制位进行操作,将 0 变为 1,1 变为 0。
    • 示例
      • 假设我们有整数 5(二进制为 101)。
      • 进行非运算:
        • 对 101 进行非运算,先将其补码形式(因为计算机中存储的是补码)的每一位取反。正数的补码就是其本身,所以取反后得到 010。
        • 这里得到的 010 是补码形式,转换为原码(因为最高位是 0,所以原码和补码相同),转换后十进制为 - 6(注意,在有符号数的情况下,非运算的结果会根据补码规则得到一个负数)。
    • 用途
      • 用于对状态进行取反。例如,在布尔逻辑中,如果一个变量表示某个状态为真(1),通过非运算可以将其变为假(0),反之亦然。
  4. 异或运算(^)
    • 定义:异或运算(^)是一种逻辑运算符。当两个对应的二进制位不同(一个为 0,一个为 1)时,结果位为 1,当两个二进制位相同(都为 0 或都为 1)时,结果位为 0。
    • 示例
      • 以 5(101)和 3(011)为例。
      • 进行异或运算:
        • 101º11,从右往左计算,第一位是 1^1 = 0;第二位是 0^1 = 1;第三位是 1^0 = 1。
        • 所以结果是 110,转换为十进制就是 6。
    • 用途
      • 用于数据加密中的简单加密算法。例如,可以将一个数据与一个密钥进行异或运算来加密,再次用相同的密钥进行异或运算就可以解密。
      • 比较两个数据是否有差异。如果两个相同长度的数据进行异或运算后结果为 0,说明这两个数据完全相同;如果结果不为 0,则说明有差异的位存在。
  5. 左移运算(<<)
    • 定义:左移运算(<<)是将一个二进制数的所有位向左移动指定的位数。左移后,右边空出的位用 0 填充。
    • 示例
      • 假设我们有整数 3(二进制为 011),将其左移 2 位。
      • 011 << 2,所有位向左移动 2 位,得到 1100。转换为十进制就是 12。
    • 用途
      • 快速实现乘法运算(乘以 2 的幂次方)。因为将一个数左移 n 位,相当于将这个数乘以2ⁿ。例如,将一个数左移 3 位,就相当于这个数乘以 8。
  6. 右移运算(>>)
    • 定义:右移运算(>>)是将一个二进制数的所有位向右移动指定的位数。对于无符号数,左边空出的位用 0 填充;对于有符号数,左边空出的位用符号位(最高位)填充。
    • 示例
      • 对于无符号数:假设我们有整数 12(二进制为 1100),将其右移 2 位。
        • 1100 >> 2,所有位向右移动 2 位,得到 0011,转换为十进制就是 3。
      • 对于有符号数:假设我们有有符号整数 - 4(二进制补码为 1100),将其右移 1 位。
        • 因为是有符号数,右移时最高位(符号位)保持不变,1100 >> 1 得到 1110,转换为十进制是 - 2。
    • 用途
      • 快速实现除法运算(除以 2 的幂次方)。对于无符号数,将一个数右移 n 位,相当于将这个数除以2ⁿ。对于有符号数,在某些情况下也可以近似地实现除法运算,但要注意符号位的处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值