Python 对负数的存储方式和 c++/c/java 的不同点

Python 中的整型是补码形式存储的 Python 中 bin 一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,方便查看 Python 中 bin 一个负数(十六进制表示),输出的是对应的二进制表示。

1、在 python 里面,负数的存储方式 实例

a = bin(-3)
print(a)

a = bin(3)
print(a)

b = bin(-3 & 0xffffffff)
print(b)

c = bin(0xfffffffd)
print(c)

//输出
//-0b11
//0b11
//0b11111111111111111111111111111101
//0b11111111111111111111111111111101

也就是说:

Python 中的整型是补码形式存储的
Python 中 bin 一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,方便查看
Python 中 bin 一个负数(十六进制表示),输出的是对应的二进制表示。

所以你为了获得负数(十进制表示)的补码,需要手动将其和十六进制数 0xfffffffd 进行按位与操作,得到结果也是个十六进制数,再交给 bin() 进行输出,得到的才是你想要的补码表示。

2、但是在c/c++/java里面负数都是以补码的形式进行存储的,《计算机原理》显示,计算机内部采用2的补码(Two’s Complement)表示负数。

3、这就出现了在Python里面需要将负数和0xffffffff进行与操作,来去掉负数前面的负号,可以理解为超过32位的东西就不进行考虑了,这进行与操作的具体步骤是:如果是正数,直接与;如果是负数,先去掉最前面的负号,再取反,再加1,再进行与操作。从而得到负数的补码。

因此对于输出的a我们也要进行截断,但是不能简单粗暴地直接&0xffffffff, 因为这样做的话-1加1是对了,结果是正数的也没问题,但是如果本来结果是负数的,这样就又出奇怪结果了。最后真正的解决方案如下:

实例

def getSum(a,b):
    while b!=0:
        ta = a
        a = a^b
        b = ((ta&b)>31
    if hibit==1:
        return -(((~a)+1)&0xffffffff)
    else:
        return a&0xffffffff

其原理是先通过第32位符号位判断是否负数,是负数则先去反加1再截断,最后加上负号;正数则直接截断。结果号称简洁,容易的Python版本变成了这样,太奇葩了。

4、所以可以查看自己的写的剑指Offer的:二进制中1的个数的求解。对于c++程序和python程序的区别(负数补码的区别)。

而且在这道题目里面,还要注意和1相减进行与操作的计算方式求解个数

5、求解二进制中1的个数,用python写,就是这样的

实例

class Solution:
   def NumberOf1(self, n):
       # write code here
       if n#这个是python里面的,python和别的语言存储负数的格式有点区别
       temp=0x00000001
       count=0
       for i in range(64):
           if n&temp:
               count=count+1
           temp=tempreturn count

6、(另一个题,但是也是按位操作)二进制(64位)中有且只有1个1(想要时间复杂度的低的关键),求解这个数字的的第几位是那个1。比如输入8,输出4。

方法1:O(n)的时间复杂度

实例

def search_1(input_n):
   if input_nfor i in range(64):
       if input_n&temp:
           return i+1
       temp=tempreturn 0

方法2:O(logn),主要是使用二分法求解,但是关键的一点是需要判断他的值的大小。其实也可以使用math.log(input_n,2)进行求解(但是这个库函数的时间复杂度就不太清楚了)

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/220488.html<

(0)
运维的头像运维
上一篇2025-04-14 14:31
下一篇 2025-04-14 14:32

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注