iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Python和 c++/c/java对于负数的存储方式有什么不同
  • 459
分享到

Python和 c++/c/java对于负数的存储方式有什么不同

2023-06-03 18:06:53 459人浏览 八月长安
摘要

本篇内容主要讲解“python和 c++/c/java对于负数的存储方式有什么不同”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python和 c++/c/java对于负数的存储方式有什么不同”

本篇内容主要讲解“pythonc++/c/java对于负数的存储方式有什么不同”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习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

也就是说:

  1. Python 中的整型是补码形式存储的

  2. Python 中 bin 一个负数(十进制表示),输出的是它的原码的二进制表示加上个负号,方便查看

  3. 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)<<1)&0xffffffff     hibit = (a&0x80000000)>>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<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

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

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

实例

def search_1(input_n):    if input_n<0:        input_n=input_n&0xffffffff    temp=0x00000001    for i in range(64):        if input_n&temp:            return i+1        temp=temp<<1    return 0

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

到此,相信大家对“Python和 c++/c/java对于负数的存储方式有什么不同”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Python和 c++/c/java对于负数的存储方式有什么不同

本文链接: https://www.lsjlt.com/news/235358.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python和 c++/c/java对于负数的存储方式有什么不同
    本篇内容主要讲解“Python和 c++/c/java对于负数的存储方式有什么不同”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python和 c++/c/java对于负数的存储方式有什么不同”...
    99+
    2023-06-03
  • 基于keras中训练数据的几种方式对比有什么不同
    这篇文章主要介绍了基于keras中训练数据的几种方式对比有什么不同,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、train_on_batchmodel.train_on_...
    99+
    2023-06-15
  • Numpy中array数组对象的储存方式(n,1)和(n,)有什么区别
    本篇内容介绍了“Numpy中array数组对象的储存方式(n,1)和(n,)有什么区别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!例如如果...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作