位运算实用指南:高效操作二进制位

位运算直接操作内存中的二进制位,常用于底层开发、性能优化和算法设计。本文通过代码示例讲解核心技巧,带你快速掌握位运算的实用操作。

移位操作:快速乘除

  • 左移(<<):等价于乘以2的幂

    8 << 1  // 二进制:1000 → 10000 (16)
    
  • 右移(>>):等价于除以2的幂(向下取整)

    8 >> 1  // 二进制:1000 → 0100 (4)
    

逻辑操作:按位计算

  • 按位或(|):将指定位置1

    8 | 7   // 1000 | 0111 = 1111 (15)
    
  • 按位与(&):提取或清零特定位

    8 & 7   // 1000 & 0111 = 0000 (0)
    
  • 按位取反(~):翻转所有位(包括符号位)

    ~8      // 00001000 → 1111.
    0111 (-9)
    

实战技巧:精准控制二进制位

1)单位置1

目标:将第n位设为1(最低位为第0位)
​操作​​:num | (1 << n)

8 | (1<<2)  // 1000 → 1100 (12)

2)多位连续置1

目标:将连续k位设为1(从第n位开始)
​操作​​:num | ((2^k - 1) << n)

8 | (3<<1)  // 1000 | 0110 → 1110 (14)

3)单位置0

目标:将第n位清零
​操作​​:num & ~(1 << n)

7 & ~(1<<2) // 0111 & 1011 → 0011 (3)

4)多位连续置0

目标:将连续k位清零(从第n位开始)
​操作​​:num & ~((2^k - 1) << n)

7 & ~(3<<1) // 0111 & 1001 → 0001 (1)

5)覆盖指定比特段

目标:将连续k位替换为新值(从第n位开始)
步骤

  1. 目标位清零:num &= ~(2^k - 1 << n)

  2. 写入新值:num |= (value << n)

    如第1-3位替换为101num &= ~(7 << 1) num |= (5 << 1)

// 13(1101) → 清除第1-3位 → 1001 → 写入101 → 1011 (11)
num &= ~(7 << 1);  // 清除第1-3位
num |= (5 << 1);   // 101左移1位→0101

位运算的优先级低于加减法,建议用括号明确计算顺序,例如 (a << 1) + 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值