python位操作以及位操作的相关性质

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相与即可。

位操作相关性质

  1. 取反操作:
>>> ~10
-11
>>> ~-10
9

解释,对数字进行位运算是以补码表示的;

10二进制:0b1010;
加符号位再去反:0b10101; 注意首位符号位,负数
再转为原码表示:-0b1011;
表示-11.

-10二进制:-0b1010;
加符号位补码表示:0b10110;
取反:0b01001;
注意首位是符号位,正数 表示9.

  1. python 以二进制补码形式打印:(32bit为例)
>>> bin(15 & 0xffffffff)
'0b1111'
>>> bin(-15 & 0xffffffff)
'0b11111111111111111111111111110001'
  1. 对于数值n,将n - 1后再和n相与,得到的值相当于将n从右边数的第一个1变成0n的二进制表示中有多少个1,就能变多少次。
  2. 数组中寻找出现一次唯一一个数,其他都是double的,数组数字全操作,即可找出。
  3. 数字n的最后二进制表示的最低位1的寻找策略是:n&(-n),结果即为最低位1,所代表的真值。也可以知道,这个结果的二进制表示中只有一个1从而也能得出,正数与它的相反数的补码二进制表示的最低位1的位置是一致的
	>>> bin(10&-10)
	'0b10'
	>>> bin(11&-11)
	'0b1'
发布了219 篇原创文章 · 获赞 85 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/z_feng12489/article/details/103365133