python⼩技巧:求32位⼆进制负数的补码,附剑指offer中的应⽤实现⽅法:
先上操作,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)
也就是说:
1. Python 中的整型是补码形式存储的
2. Python 中 bin ⼀个负数(⼗进制表⽰),输出的是它的原码的⼆进制表⽰加上个负号
3. Python 中 bin ⼀个负数(⼗六进制表⽰),输出的是对应的⼆进制表⽰。(注意此时)
所以为了获得负数(⼗进制表⽰)的补码,需要⼿动将其和⼗六进制数 0xfffffffd 进⾏按位与操作,得到结果也是个⼗六进制数,再交给bin() 进⾏输出,得到的才是你想要的补码表⽰。
2、但是在c/c++/java⾥⾯负数都是以补码的形式进⾏存储的,《计算机原理》显⽰,计算机内部采⽤2的补码(Two’s Complement)表⽰负数。
3、这就出现了在Python⾥⾯需要将负数和0xffffffff进⾏与操作,来去掉负数前⾯的负号,可以理解为超过32位的东西就不进⾏考虑了,这进⾏与操作的具体步骤是:如果是正数,直接与;如果是负数,先去掉最前⾯的负号,再取反,再加1,再进⾏与操作。从⽽得到负数的补码。