现在的位置: 首页 > 软件测试 > 测试技术 > 软件测试 > 正文

Python位运算之取反运算~详解

2017年07月18日 测试技术, 软件测试 ⁄ 共 986字 ⁄ 字号 评论关闭 ⁄ 阅读 225 次

最近小伙伴问了一个非常有意思的问题:

Python中的位运算符包括~、&、|、……、<<、>>,都是在二进制基础之上进行的运算,其他的都能理解,但是~却理解不了。比如a=60,a的二进制为0011 1100,那么~a应该是1100 0011,转换为十进制为195啊!怎么解释里为~a=-(a+1)=-61?

 

翻了下《Python核心编程》,记录这个问题的解决思路:

1. 首先我们需要明白,python里的标准整形数字,在32位及64位机器上的取值范围如下:

32位:-2^31~2^31-1

64位:-2^63~2^63-1

 

2. ~运算的标准解释是:

~num 单目运算,对数的每一位取反,结果为 -(num+1)

 

3. a=60时,不仅仅是0011 1100,在32位机器上其实是

0b00000000000000000000000000111100

取反就是

0b11111111111111111111111111000011

那我们直接转成十进制后print看看

print int(0b00000000000000000000000000111100)
print int(0b11111111111111111111111111000011)

>>>
60
4294967235

为啥结果不对呢?

因为Python自从2.2版本起,自带大数整数运算,整数不会溢出(溢出时,Python会自动将整型数据转换为长整型),只要机器内存足够就可以

那么,我们写个整形数字溢出判断转换方法,再看看:

def int_overflow(val):  
    maxint = 2147483647  
    if not -maxint-1 <= val <= maxint:  
        val = (val + (maxint + 1)) % (2 * (maxint + 1)) - maxint - 1  
    return val  

print int(0b00000000000000000000000000111100)
print int(0b11111111111111111111111111000011)
print int_overflow(int(0b11111111111111111111111111000011))

>>>
60
4294967235
-61

现在明白了吗?

 

其实,记住最重要的这一句就好:

~num 单目运算,对数的每一位取反,结果为 -(num+1)

抱歉!评论已关闭.