Python 对于负数的存储体例和 c++/c/java 纷歧样(二进制中 1 的个数)

发布日期:2019-09-14 07:21:43 阅读数: 1012次 来源:亚博手机app

亚博手机app-
					<p>1、在 python 里面,负数的存储体例</p>

<div class=

实例

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我们也要进行截断,可是不克不及简单粗暴地间接&0xffff亚博手机appffff, 由于如许做的话-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)进行求解(可是这个库函数的时间复杂度就不太清晰了)

本文由亚博编辑整理"/>

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我们也要进行截断,可是不克不及简单粗暴地间接&0xffff亚博手机appffff, 由于如许做的话-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)进行求解(可是这个库函数的时间复杂度就不太清晰了)

本文由亚博编辑整理亚博手机app