文章目录
python 中整型的存储
在 python2
时代,整型有 int
类型和 long
长整型,长整型不存在溢出问题,即可以存放任意大小的整数。在 python3
后,统一使用了长整型。这就使得python3
中整型数据永远不会溢出,这要内存
放得下。这种长整型处理机制
的可能性,可以参见这篇博文。
由于这种对长整形数据特殊的处理机制
,致使我们是不知道这一个大数
在内存
中存储需要占用几个字节
,因为不会溢出,不会有固定的存储字节单位
。我们于是可以得到它的一个整型数据,必然不是用补码
表示的。因为存储它的字节长度没有固定。如下:
#python3
>>> bin(10)
'0b1010'
>>> bin(-10)
'-0b1010'
但是如果一个整型进行位运算,以存储字节码长的数字为准,进行补码表示
,在进行位运算
。也就是说位运算是利用整型补码形式进行的
。如下:
>>> bin(5&15)
'0b101'
>>> bin(-5&15)
'0b1011'
>>> ~15
-16
那么我们如果想要打印出长整型数据的二进制补码表示,只要限定存储字节码的长度即可。以32bit存储,如下:
>>> bin(15 & 0xffffffff)
'0b1111'
>>> bin(-15 & 0xffffffff)
'0b11111111111111111111111111110001'
那么15
,与-15
的补码形式如上,可以看出长整型的补码
表示,只要与其存储长度的全1相与
即可。
位操作相关性质
- 取反操作:
>>> ~10
-11
>>> ~-10
9
解释,对数字进行位运算是以补码表示的;
10二进制:0b1010;
加符号位再去反:0b10101; 注意首位符号位,负数
再转为原码表示:-0b1011;
表示-11.
-10二进制:-0b1010;
加符号位补码表示:0b10110;
取反:0b01001;
注意首位是符号位,正数 表示9.
- python 以二进制补码形式打印:(32bit为例)
>>> bin(15 & 0xffffffff)
'0b1111'
>>> bin(-15 & 0xffffffff)
'0b11111111111111111111111111110001'
- 对于数值
n
,将n - 1
后再和n
相与,得到的值相当于将n
从右边数的第一个1
变成0
。n
的二进制表示中有多少个1
,就能变多少次。 - 数组中寻找出现
一次
的唯一一个数
,其他都是double
的,数组数字全与
操作,即可找出。 - 数字n的最后二进制表示的最低位1的寻找策略是:
n&(-n)
,结果即为最低位1,所代表的真值
。也可以知道,这个结果的二进制表示中只有一个1
。从而也能得出,正数与它的相反数的补码二进制表示的最低位1的位置是一致的
。
>>> bin(10&-10)
'0b10'
>>> bin(11&-11)
'0b1'