張俊玲
19021210858
轉(zhuǎn)載自:https://blog.csdn.net/u011956367/article/details/102758066
【嵌牛導(dǎo)讀】在Python中如何實(shí)現(xiàn)整數(shù)的原碼普气、反碼、補(bǔ)碼和移碼佃延。
【嵌牛鼻子】正數(shù)?負(fù)數(shù)?原碼?反碼?補(bǔ)碼?移碼?
【嵌牛提問】正數(shù)和負(fù)數(shù)分別取原碼现诀、反碼、補(bǔ)碼和移碼的規(guī)則是什么履肃?
【嵌牛正文】
在計(jì)算機(jī)中赶盔,數(shù)據(jù)以二進(jìn)制表示,本文以第一個(gè)0/1表示符號位榆浓,以bin(x)表示x絕對值的二進(jìn)制串,以rev(x)表示x絕對值的二進(jìn)制串按位取反的二進(jìn)制串。
例如:
bin(2)=10
rev(2)=01
原碼
正數(shù)的原碼
0,bin(x)
負(fù)數(shù)的原碼
1,bin(x)
反碼
正數(shù)的反碼
0,bin(x)
負(fù)數(shù)的反碼
1,rev(x)
補(bǔ)碼
正數(shù)的補(bǔ)碼
0,bin(x)
負(fù)數(shù)的補(bǔ)碼
1,rev(x)+1
移碼
正數(shù)的補(bǔ)碼
1,bin(x)
負(fù)數(shù)的補(bǔ)碼
0,rev(x)+1
規(guī)則
0的原碼反碼補(bǔ)碼相等撕攒,均為0,0
正數(shù)的原碼反碼補(bǔ)碼相等
負(fù)數(shù)的反碼等于原碼的數(shù)值按位取反(符號位不變)
負(fù)數(shù)的補(bǔ)碼等于反碼加1
移碼等于補(bǔ)碼的符號位取反
python實(shí)現(xiàn)
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('補(bǔ)碼是:%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('請輸入一個(gè)十進(jìn)制整數(shù):\n'))
? ? ? ? if s>=0:
? ? ? ? ? ? flag=0
? ? ? ? else:
? ? ? ? ? ? flag=1
? ? ? ? _s=getbin(s)
? ? ? ? out(s)
? ? ? ? print()
? ? except IOError:
? ? ? ? break
請輸入一個(gè)十進(jìn)制整數(shù):
-2
原碼是:1,10
反碼是:1,01
補(bǔ)碼是:1,10
移碼是:0,10
請輸入一個(gè)十進(jìn)制整數(shù):
2
原碼是:0,10
反碼是:0,10
補(bǔ)碼是:0,11
移碼是:1,11