「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」。
在计算机中,数据以二进制形式存储,在有符号数中,以二进制最高位的表示符号位,本文以表示绝对值的二进制串,以表示绝对值的二进制串按位取反的二进制串。
例如:
- bin(2)=10
- rev(2)=01
原码
原码就是二进制数的数值码加上最高位的表示符号位。 如果不看最高位,剩余位的值就是二进制数的绝对值,这就是原码的性质。
反码
正数的反码等于正数的原码,负数的反码等于负数的原码数值位取反。
补码
正数的补码等于正数的原码,负数的补码等于负数的反码加上1,也等于负数的原码数值位取反后整体加上1。
移码
移码等于补码符号位取反。
规则
- 0的原码反码补码相等,均为0,0
- 正数的原码反码补码相等
- 负数的反码等于原码的数值按位取反(符号位不变)
- 负数的补码等于反码加1
- 移码等于补码的符号位取反
python实现
flag=0
_s=''
计算二进制数
首先定义一个函数用于获取整数绝对值的二进制串
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):
print('原码是:%d,%s\t'%(flag,_s))
def f(s):
global _s
if flag==0:
print('反码是:%d,%s\t'%(flag,_s))
return
_s=rev(_s)
print('反码是:%d,%s\t'%(flag,_s))
return
def by(s):
global _s
_s=int(_s,2)+1
_s=getbin(_s)
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'))
if s>=0:
flag=0
else:
flag=1
_s=getbin(s)
out(s)
print()
except IOError:
break
测试
1
当我们输入时,输出如下:
原码是:1,10
反码是:1,01
补码是:1,10
移码是:0,10
2
当我们输入时,输出如下:
原码是:0,10
反码是:0,10
补码是:0,11
移码是:1,11