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,再进行与操作。从而得到负数的补码。

参考:https://www.runoob.com/w3cnote/python-negative-storage.html

猜你喜欢

转载自blog.csdn.net/weixin_44414948/article/details/114809621