人生苦短,我用python。

一、进制和位运算

1、X进制

X进制(十进制、二进制、八进制、十六进制):

每一位只允许出现 0~X-1 这几个数字,逢X进一,基是X, 每一位有一个权值大小是X的幂次。 其表示的数值可以写成按位权展开的多项式之和。

2、二进制有符号和无符号

规则:把二进制数中的最高位(最左边的那位)用作符号位

  • 对于有符号数,最高位被计算机系统规定为符号位(0为正,1为负)
  • 对于无符号数,最高位被计算机系统规定为数据位
  • +1 = 0000 0000 0000 0001
  • -1 = 1000 0000 0000 0001

数字在计算机中,是用二进制补码的形式来保存的,因此-1 +1需要按照补码进行相加才是正确的结果。

3、原码、反码、补码

规则:

  • 正数:原码 = 反码 = 补码
  • 负数:反码 = 符号位不变,其他位取反; 补码 = 反码+1
1
2
3
4
 1的原码:0000 0000 0000 0001
-1的原码:1000 0000 0000 0001
-1的反码:1111 1111 1111 1110
-1的补码:1111 1111 1111 1111

重新计算 -1+1 结果:

1
2
3
4
1111 1111 1111 1111
0000 0000 0000 0001
---------------------------
0000 0000 0000 0000 # 高位舍去,所以结果是0

补码转回原码:

  • 原码 = 补码的符号位不变 –>数据位取反–> 尾+1
1
2
3
-1的补码:1111 1111 1111 1111
取反:1000 0000 0000 0000
-1的原码:1000 0000 0000 0001

4、进制间转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 10进制转为2进制
bin(10) # '0b1010'

# 2进制转为10进制
int('1001',2) # 9

# 10进制转为16进制
hex(10) # '0xa'

# 16进制转为10进制
int('ff', 16) # 255
int('0xab', 16) # 171

# 10进制转为8进制
oct(8) # '0o10'

# 8进制转为10进制
int('0o10', 8 ) # 8

# 16进制转为2进制
bin(0xa) # '0b1010'

# 2进制转为16进制
hex(0b1001) # '0x9'

5、位运算

直接操作二进制,省内存,效率高

  • & 按位与,全1为1否则为0
  • | 按位或,有1就1否则为0
  • ^ 按位异或,不同为1否则为0
  • ~ 按位取反
  • << 按位左移,各二进位全部左移n位,高位丢弃,低位补0
  • >> 按位右移,各二进位全部右移n位,保持符号位不变

注意事项:

  • 二进制左移一位,变成原来的二倍,相当于乘2;相反,右移一位相当于除2
  • 左移可能会改变一个数的正负性,右移不会改变一个数的符号
  • 左移用途:快速计算一个数乘以2的n次方 (8<<3 等同于8*2^3)
  • 右移用途:快速计算一个数除以2的n次方 (8>>3 等同于8/2^3)

持续更新…

最后更新: 2018年12月04日 16:46

原始链接: http://pythonfood.github.io/2017/12/30/python进制和位运算/

× 多少都行~
打赏二维码