实现方法:
先上操作,python里面的负数直接将其和 0xffffffff 进行 与(&) 操作即可得到其补码:
def func(n):
if n<0:
n=n&0xffffffff #这个是python里面的,python和别的语言存储负数的格式有点区别
剑指offer例题(应用):
题目:
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
题解python代码:
class Solution:
def NumberOf1(self, n):
# write code here
if n<0:
n=n&0xffffffff #这个是python里面的,python和别的语言存储负数的格式有点区别
temp=0x00000001
count=0
for i in range(64):
if n&temp:
count=count+1
temp=temp<<1
return count
以下是 计算补码 原理部分,有兴趣的同学可以看一下:
——————————————————————————————————
存储方式:
Python 对于负数的存储方式和 c++/c/java 不一样
1、在 python 里面,负数的存储方式
a = bin(-3)
print(a)
a = bin(3)
print(a)
b = bin(-3 & 0xffffffff)
print(b)
c = bin(0xfffffffd)
print(c)
也就是说:
- Python 中的整型是补码形式存储的
- Python 中 bin 一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号
- Python 中 bin 一个负数(十六进制表示),输出的是对应的二进制表示。(注意此时)
所以为了获得负数(十进制表示)的补码,需要手动将其和十六进制数 0xfffffffd 进行按位与操作,得到结果也是个十六进制数,再交给 bin() 进行输出,得到的才是你想要的补码表示。
2、但是在c/c++/java里面负数都是以补码的形式进行存储的,《计算机原理》显示,计算机内部采用2的补码(Two’s Complement)表示负数。
3、这就出现了在Python里面需要将负数和0xffffffff进行与操作,来去掉负数前面的负号,可以理解为超过32位的东西就不进行考虑了,这进行与操作的具体步骤是:如果是正数,直接与;如果是负数,先去掉最前面的负号,再取反,再加1,再进行与操作。从而得到负数的补码。
参考:https://www.runoob.com/w3cnote/python-negative-storage.html