0%

位运算

进制与位运算

在我们编程的领域,进制的重要性不言而喻。为什么我的世界只有0与1,这之间到底有什么不可不知的秘密

为什么旁边的“高级工程师”,天天学框架、学架构,反而给他学废了。这一切的一切究竟是计算机的计算扭曲,还是计算机的道德沦丧。今天让我们进入哪个传说中只有0与1的世界。

进制介绍

进制是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally
mark计数)。 对于任何一种进制—X进制,就表示每一位置上的数运算时都是逢X进一位。
是逢十进一,是逢十六进一,就是逢二进一,以此类推,x进制就是逢x进位。

常见进制表示

二进制: 0, 1 逢2进1,常以0b,0B开头

八进制:0-7 逢8进1,常以o开头

十进制:0-9 逢10进1

十六进制:逢16进1,0-9 A(10)-F(15 )常以0x开头

进制运算

二进制数的加法和乘法基本运算法则各有四条,如下:

0+0=0,0+1=1,1+0=1,1+1=10

0×0=0,0×1=0,1×0=0,1×1=1

进制转换

十进制转二进制

一个十进制整数转换为二进制整数通常采用除二取余法,即用2连续除十进制数,直到商为0,逆序
排列余数即可得到――简称除二取余法.

上面这段话是什么意思呢?逆序排列即二进制中的从高位到低位排序

如以下为例

1
2
3
4
5
6
7
# 十进制11的二进制
11 ➗ 2 = 5 余 1
5 ➗ 2 = 2 余 1
2 ➗ 2 = 1 余 0
1 ➗ 2 = 0 余 1

11 = (1011)2
  1. 十进制数除以 2 ,得到商和余数;
  2. 再用第一步的商除以 2,得到新的商和余数;
  3. 重复第 1 和第 2 步,直到商为 0;
  4. 将先得到的余数作为二进制数的高位,后得到的余数作为二进制数的低位,依次排序;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def decimal_to_binary(value: int):
if value == 0:
return 0b0
if not isinstance(value, int):
raise ValueError("Accepted parameters must be int")
flag = False if value <= 0 else True
value = abs(value)
result = []
while value:
if value % 2 == 1:
result.append('1')
else:
result.append('0')
value >>= 1
return '0b' + ''.join(result[::-1]) if flag else '-0b' + ''.join(result[::-1])

二进制转十进制

二进制转化为十进制的原理,(二进制数长度(不含0b) - 1) 次方 X 此位置的数值

1
2
3
0b1101 13
2的3次方 乘 1 + 2的2次方 乘 1 + 2的1次方 乘 0 + 2的0次方 乘 1
8 + 4 + 0 + 1

代码实现

1
2
3
4
5
6
7
8
9
def binary_to_decimal(binary: str):
binary_list = binary.split("0b")[-1] if '0b' in binary else binary
# 判断是否为正数
flag = True if '-' not in binary else False
sum = 0
for index, value in enumerate(binary_list):
a = 2 ** int(len(binary_list) - index - 1)
sum += a * int(value)
return sum if flag else f'-{sum}'
1
2
3
4
13: 
binary:0b1101
oct:(001) (101) 0o15
hex:0000 (1101) 0xd

同理得进制转换

原码、反码、补码

位运算

现代的计算器技术全部采用的是二进制,因为他只使用0、1两个数字符号,非常简单方便,易于计算机实现。计算机内部都是采用二进制数来表示