在计算机中,数据以二进制形式存储,在有符号数中,以二进制最高位的 0 / 1 0/1 0/1表示符号位,本文以 b i n ( x ) bin(x) bin(x)表示 x x x绝对值的二进制串,以 r e v ( x ) rev(x) rev(x)表示 x x x绝对值的二进制串按位取反的二进制串。
例如:
- bin(2)=10
- rev(2)=01
原码
原码就是二进制数的数值码加上最高位的
0
/
1
0/1
0/1表示符号位。
如果不看最高位,剩余位的值就是二进制数的绝对值,这就是原码的性质。
反码
正数的反码等于正数的原码,负数的反码等于负数的原码数值位取反。
补码
正数的补码等于正数的原码,负数的补码等于负数的反码加上1,也等于负数的原码数值位取反后整体加上1。
移码
移码等于补码符号位取反。
规则
- 0的原码反码补码相等,均为0,0
- 正数的原码反码补码相等
- 负数的反码等于原码的数值按位取反(符号位不变)
- 负数的补码等于反码加1
- 移码等于补码的符号位取反
python实现
计算二进制数
首先定义一个函数用于获取整数绝对值的二进制串
def getbin(s):
_s=bin(abs(s))
_s=_s.replace('0b','')
return _s
取反
然后定义一个函数用于对二进制串按位取反。
def rev(s):
s=s.replace('1','2')
s=s.replace('0','1')
s=s.replace('2','0')
return s
实现四码函数
def y(s):
_s = getbin(s)
flag = 0 if s >= 0 else 1
print('原码是:%d,%s\t' % (flag, _s))
def f(s):
_s = getbin(s)
flag = 0 if s >= 0 else 1
if flag != 0:
_s = rev(_s)
print('反码是:%d,%s\t' % (flag, _s))
return
def by(s):
_s = getbin(s)
if s < 0:
_s = int(rev(_s), 2) + 1
_s = getbin(_s)
flag = 0 if s >= 0 else 1
print('补码是:%d,%s\t' % (flag, _s))
print('移码是:%d,%s\t' % ((flag + 1) % 2, _s))```
输出代码
def out(s):
y(s)
f(s)
by(s)
while True:
try:
s = int(input('请输入一个十进制整数:\n'))
out(s)
print()
except IOError:
break
测试
1
当我们输入 − 2 -2 −2时,输出如下:
原码是:1,10
反码是:1,01
补码是:1,10
移码是:0,10
2
当我们输入 2 2 2时,输出如下:
原码是:0,10
反码是:0,10
补码是:0,10
移码是:1,10