位运算的应用

位运算符

bin(60) # 转换成二进制数
int('1100',2)   # 将二进制转换成十进制
  • & : 按位.都为1才为1
  • | : 按位.存在1即为1
  • ^ : 按位异或.相同的为0,不同的为1
  • ~ : 按位.正数的补码,反码都是其本身.
  • << : 左移
  • >> : 右移

原码,反码,补码:

  • 原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1。比如十进制3如果用8个二进制位来表示就是 00000011, -3就是 10000011。
  • 反码表示方法:正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
  • 补码表示方法:正数的补码是其本身;负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1。 (即在反码的基础上+1)
      原码          反码        补码
60    0111100       0111100     0111100
-60   1111100       1000011     1000100

按位运算的应用

1. 判断断奇、偶数

num & 0x1 # 1->奇数 0->偶数

2. 对一个数变换符号

~num + 1

3. 不用额外的变量实现两个数字互换

def swap(num_1, num_2):
    num_1 ^= num_2
    num_2 ^= num_1
    num_1 ^= num_2
    return num_1, num_2

4. 不用判断语句来实现求绝对值

def bit_abs(num):
    negative = num >> 31 #操作系统为32位
    return (num ^ negative) - negative

5. 在按位操作中,n << k相当于 n * 2^k