if (-2147483648<n<2147483648): #将运算定义在32位字节以内。
#同时由于第一位为符号位,实际取值为正负2^31开区间
if (n >= 0): #正数(与0)的原、反、补码相同,作为一个类别
h=[] #创建一个空集
while (n > 1): #十进制转换二进制
m = n%2
m = int(m) #由于取余的运算会产生.0,所以利用取整将其去掉
h.append(m)
n = (n - m)/2
if (len(h)>=30):
break
h.append(1)
h.reverse() #记得最后要调换顺序非常重要
while (len(h)<31): #对于符号位和转换后二进制之间的空位用0补满
h.insert(0,0)
if(len(h)==31):
break
h.insert(0,0) #正数(与0)的符号位均为0
print("该数的原码是:",h)
c = o = h #建立反码集、补码集
print("该数的反码是:",o)
print("该数的补码是:",c)
elif(n < 0): #对于负数展开讨论
n = -n #首先变成正数
rev = [] #建立一个空集
while (n > 1): #十进制转二进制
m = n%2
m = int(m)
rev.append(m)
n = (n - m)/2
if (len(rev)>=30):
break
rev.append(1)
rev.reverse()
while (len(rev)<31): #补0
rev.insert(0,0)
if(len(rev)==31):
break
rev.insert(0,1) #负数的符号位为1
print("该数的原码为:",rev)
o = rev[:] #注意!python中一个列表直接赋值给另一个列表时,两个列表内部的元素会同时改
#变,影响补码的生成
#所以在这里采用切片的方式,避免了rev被更改
for i in range (1,32,1): #将反码集中除符号位的其他所有项0、1颠倒
if (o[i] == 1):
o[i] = 0
elif (o[i] == 0):
o[i] = 1
print("该数的反码为:",o)
c = o[:] #同样采用切片操作
if (c[-1] == 0): #对于最后一位做出判断,是否需要进位
c[-1] = 1
print("该数的补码为:",c)
elif (c[-1] == 1): #需要进位
c[-1] = 0
for x in range (30,0,-1): #从后向前遍历,遇到1就变成0(进位),遇到0则变成1,
#脱离for循环
if (c[x] == 0):
c[x] = 1
break
elif (c[x] == 1):
c[x] = 0
print("该数的补码为:",c)
else: #超出正负2^31时输出文字
print("Out of the range!")
Python中32位字节整数的原码、反码和补码显示
最新推荐文章于 2024-04-28 16:37:02 发布