python的按位运算
来源:互联网 发布:遗传算法本质 编辑:程序博客网 时间:2024/06/06 16:48
华电北风吹
天津大学认知科学与计算重点实验室
最后修改日期:2015/8/6
python提供了丰富的位运算操作符,例如按位与,按位或,按位异或,左移位,右移位和取反操作,例子代码如下
>>> a,b=45,83>>> bin(a),bin(b)('0b101101', '0b1010011')>>> a|b,bin(a|b)(127, '0b1111111')>>> a^b,bin(a^b)(126, '0b1111110')>>> a&b,bin(a&b)(1, '0b1')>>> a<<3,bin(a<<3)(360, '0b101101000')>>> a>>3,bin(a>>3)(5, '0b101')>>> ~a,bin(~a)(-46, '-0b101110')
按位与,按位或,按位异或,左移位,右移位这几个跟以前理解的没啥区别,就一个高位补零
下面主要解释一下取反操作
变量a的二进制编码为’0b101101’,取反操作后却变为’-0b101110’,最大变化由正数变为负数,而不是期望的按每一位取反’0b010010’,这个主要是由于计算机对于整数二进制编码引起的。
整数在计算机中的存储格式有最高位的标志位和低位的数值绝对值位。整数的绝对值位就是本身,而负数保存的是他的补码。
现在回归到(~a)执行过程上来,python在执行取反操作的时候确实是按照每一位进行取反了,不过他把标志位也给取反了,然后编译器认为这是一个负数,所以在解析的时候就按照按位取反得到补码,然后根据补码解析原码的过程解析。
bin(a)=’0b101101’
按位取反得到负数:’-0b010010’
解析负数:
得到反码:’-0b101101’ (除标志位,按位取反)
得到补码:’-0b101110’ (绝对值位+1)
验证过程如下
>>> a=45>>> ~a-46>>> int('-0b101110',2)-46>>> bin(-46)'-0b101110'
这里需要注意的一点就是bin是解析二进制字符串;~是对内存的01操作,不考虑补位存储
理解了以上以后可以看一个更一般的例子
>>> -1&-5-5
因为-1二进制编码为1+00001,补码(内存编码):1+11111,-5二进制编码1+00101,补码(内存编码):1+11011,两个负数内存编码按位取与,得到1+11011,对应的补码即为1+00101,二进制对应的即为-5
- python的按位运算
- python-opencv:图像的位运算
- Python按位运算符,字典,运算符优先级的基本总结
- Python语言中的按位运算
- Python中的按位运算符
- python 位运算
- python位运算纪录
- Python位运算符
- python 位运算
- Python-位运算符
- 位运算--python
- 按位运算的用途
- 按位与&的运算
- python中的位运算符
- 自学理解Python 位运算
- python: Bitwise Operators (位运算)
- 原码 反码 补码 及 python的位运算
- 位运算数的运算
- Linux Crontab命令
- Myeclipse中改变变量、方法等的颜色
- 用perl读写Excel表格
- 超级网址汇总
- android 通过UncaughtExceptionHandler 捕获RuntimeException,并将捕获到的信息上传到友盟
- python的按位运算
- android获取string.xml的值
- HDU_1061_RightmostDigit
- Roman to Integer
- 【独立开发者er Cocos2d-x实战 011】Cocos2dx 3.x命令行生成APK详解
- 跟着9张思维导图学习Javascript
- Using Undo/Redo with Item Views
- Activity统一退出
- sublime学习之--批量在多行首位添加代码