Zhao70's Blog

位运算Part1

六种位运算符


& 按位与

用处

  • 将变量某些位清0且同时保持其他位不变
    example: 将int变量n的低8位全置成0, 而其余位不变, n = n & 0xffffff00;
  • 获取变量中的某一位
    example: 判断一个int类型变量第n位是否是1(从右往左, 从0开始数), n & 0x80 是否等于 0x80(即1000 0000)
  • 判断一个数字的奇偶
    example: 一个数 ^ 1 的结果就是二进制的最末位

| 按位或

用处

  • 将变量某些位置1且同时保持其他位不变
    example: 将int类型变量n的低8位全置成1, 而其余位不变, n |= 0xff(1111 1111)
  • 二进制特定位上无条件赋值
    example: 把二进制最末尾变1, (n | 1) - 1

^ 按位异或

规则

  • 相同取0,相异取1

特点

  • 若a ^ b = c, 那么就有 c ^ b = a以及 c ^ a = b.此规律可用来进行简单的加密和解密

用处

  • 将变量某些位取反且同时保持其他位不变
    example: 将int类型变量n的低8位取反, 而其余位不变, n = n ^ 0xff(1111 1111)

    1
    2
    3
    4
    5
    0000 0000 1111 1111
    ^
    0010 1110 1001 0000
    ==
    0010 1110 0110 1111
  • 不使用中间变量交换a, b的值

    1
    2
    3
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;

~ 按位非(单目)

<< 左移

规则

  • 高位直接丢弃, 低位补0

    用处

  • 把一个数左移n位就相当于乘以2的n次方// 但可能改变符号

    >> 右移

    规则

  • 低位直接丢弃, 大多数C/C++编译器规定, 如果原符号位为1, 则右移时高位就补充1, 原符号位位0, 则右移时高位就补充0

    用处

  • 把一个数右移n位就相当于除以2的n次方(不改变符号), 但时向小里取整, 而不是丢失小数位
  • 写出一个表达式的值与 a的第n位相同(从右向左, 从0开始): (a >> n) & 1 或 (a & (1 << n)) >> n //0 <= n < 31