23.Python位运算符详解
位运算符通常在图形、图像处理和创建设备驱动等底层开发中使用。使用位运算符可以直接操作数值的原始 bit 位,尤其是在使用自定义的协议进行通信时,使用位运算符对原始数据进行编码和解码也非常有效。
位运算符对于初学者来说有些难度,因此初学者可先跳过本节内容。
位运算符的操作对象是整数类型,它会把数字看做对应的二进制数来进行计算。Python 支持的位运算符如表 1 所示。
| 位运算符 | 说 明 | 使用形式 | 举 例 |
|---|---|---|---|
| & | 按位与 | a & b | 4 & 5 |
| | | 按位或 | a | b | 4 | 5 |
| ^ | 按位异或 | a ^ b | 4 ^ 5 |
| ~ | 按位取反 | ~a | ~4 |
| << | 按位左移 | a << b | 4 << 2,表示数字 4 按位左移 2 位 |
| >> | 按位右移 | a >> b | 4 >> 2,表示数字 4 按位右移 2 位 |
& 按位与运算符
按位与运算的运算符是 &,它有 2 个操作数,其运算法则是,按位将 2 个操作数对应的二进制数一一对应,只有对应数位都是 1 时,此为对应的结果位才是 1;反之,就是 0。
按位与运算的运算法则如表 2 所示。
| 第一个操作数 | 第二个操作数 | 结果位的值 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
例如,在 Python 交互式解释器中,计算 12 & 8 的值,执行过程如下:
>>> 12 & 8
8
计算过程如图 3 所示。

图 3 12 & 8 的计算过程
| 按位或运算符
按位或运算的运算符是 |,它有 2 个操作数,运算法则是,按位将 2 个操作数对应的二进制数一一对应,只有对应数位都是 0,所得结果才是 0;反之,就是 1。
按位或运算的运算法则如表 4 所示。
| 第一个操作数 | 第二个操作数 | 结果位的值 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
例如,在 Python 交互式解释器上计算 4 | 8 的值,执行过程如下:
>>> 4 | 8
12
计算过程如图 5 所示。

图 5 4 | 8 的计算过程
^按位异或运算符
按位异或运算的运算符是 ^,它有 2 个操作数,运算法则是,按位将 2 个操作数对应的二进制数一一对应,当对应位的二进制值相同(同为 0 或同为 1)时,所得结果为 0;反之,则为 1。
^ 运算符的运算法则如表 6 所示。
| 第一个操作数 | 第二个操作数 | 结果位的值 |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
例如,在 Python 交互式解释器中,计算 31 ^ 22 的值,其执行过程为:
>>> 31 ^ 22
9
计算过程如图 7所示。

图 7 31^22的计算过程
~按位取反运算符
按位取反,也常称为“按位非”运算,此运算的运算符为 ~,它只有 1 个操作数,其运算法则为:将操作数的所有二进制位,1 改为 0,0 改为 1。
例如,使用 Python 交互式解释器计算 -5 取反后的结果,其执行过程为:
>>> ~-5
4
注意,此运算过程涉及与计算机存储相关的内容,首先需要了解什么是原码、反码以及补码:
- 原码是直接将一个数值换算成二进制数。有符号整数的最高位是符号位,符号位为 0 代表正数,符号位为 1 代表负数。无符号整数则没有符号位,因此无符号整数只能表示 0 和正数。
- 反码的计算规则是:对原码按位取反,只是最高位(符号位)保持不变。
- 补码的计算规则是:正数的补码和原码完全相同,负数的补码是其反码 +1;
其实,所有数值在计算机底层都是以二进制形式存在的,为了方便计算,计算机底层以补码的形式保存所有的整数(如图 8 所示):
通过图 8 可以得出,按位取反运算,实际上就是对存储在计算机底层中,以补码形式存储的整数进行按位取反所得的最终值。
注意,本节涉及到的所有按位运算符,操作的二进制数,都是操作数的补码形式。
<<左移运算符
左移运算符是将操作数补码形式的二进制数,整体左移指定位数,左移后,左边溢出的位直接丢弃,右边空出来的位以 0 来填充。例如如下代码:
>>> 5 << 2
20
>>>-5 << 2
-20
图 9 示范了 -5 左移两位的运算过程。

图 9 -5 左移两位的运算过程
在图 5 中,上面的 32 位数是 -5 的补码,左移两位后得到一个二进制补码,这个二进制补码的最高位是 1,表明是一个负数,换算成十进制数就是 -20。
>>右移运算符
Python 的右移运算符为 >>,其运行法则是,把操作数补码形式的二进制右移指定位数后,左边空出来的位以符号位来填充,右侧溢出位直接丢弃。
请看下面代码:
>>> -5 >> 2
-2
图 10 给出了-5 >> 2 的运算过程。

图 10 -5>>2 的运算过程
从图 10 来看,-5 右移两位后左边空出两位,空出来的两位以符号位来填充,右边溢出的两位被直接丢弃。因此,右移运算后得到的结果的正负与第一个操作数的正负相同。右移后的结果依然是一个负数,我们知道,这是一个负数的补码(负数的补码和原码不同),换算成十进制数就是 -2。
必须指出的是,无论是左移运算符还是右移运算符,它们都只适合对整型数进行运算。
在进行位移运算时,不难发现,左移 n 位就相当于来以 2 的 n 次方,右移 n 位则相当于除以 2 的 n 次方(如果不能整除,实际返回的结果是小于除得结果数值的最大整数的)。不仅如此,进行位移运算只是得到了一个新的运算结果,而原来的操作数本身是不会改变的。
23.Python位运算符详解的更多相关文章
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
位运算符主要针对二进制,它包括了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面 ...
- 基础知识复习(一)——C语言位运算符详解
常用的位运算符:与(&),取反(~),或(|),异或(^),左移(«),右移(») 1. 与(&)操作符,按位与,全为1 时,结果取1 11001 &10011 结果:1000 ...
- Mysql 的位运算符详解,mysql的优先级
位运算是将给定的操作数转化为二进制后,对各个操作数每一位都进行指定的逻辑运算,得到的二进制结果转换为十进制数后就是位运算的结果.MySQL 5.0 支持6 种位运算符,如表4-4 所示. 可以发现,位 ...
- C语言位运算符详解
原文链接:https://www.cnblogs.com/911/archive/2008/05/20/1203477.html 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题 ...
- python之struct详解
python之struct详解 2018-05-23 18:20:29 醉小义 阅读数 20115更多 分类专栏: python 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
- Python字符编码详解,str,bytes
什么是明文 “明文”是可以是文本,音乐,可以编码成mp3文件.明文可以是图像的,可以编码为gif.png或jpg文件.明文是电影的,可以编码成wmv文件.不一而足. 什么是编码?把明文变成计算机语言 ...
- 《python开发技术详解》|百度网盘免费下载|Python开发入门篇
<python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby 内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...
- python time模块详解
python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明 一.简介 ...
随机推荐
- Unity Button按钮延迟
1.把下面脚本放到Editor文件夹下,这样脚本继承Button之后,新声明的public变量才能在Inspector面板显示出来. using System.Collections; using S ...
- 百度URL链接中文转码
百度搜索链接规则为: http://www.baidu.com/s?wd=[搜索词目]&cl=3 有多个搜索词通过加号进行链接: http://www.baidu.com/s?wd=keywo ...
- 10 Django之Ajax请求
一.什么是Ajax技术? 异步的JavaScript和XML.使用Javascript语言与服务器进行异步交互,传输的数据为XML(更多的使用json数据).Ajax不是一门新的编程语言,而是一种使用 ...
- 解决 Ubuntu 19 安装openjdk 8后与openjfx不兼容
小淘气放假了,孩子在上幼儿园的小朋友,报班也不能太变态嘛, 还是让他自己娱乐的时间多一点,但是现在在家的娱乐就是看电视,听说电视看多了越看越傻,就想方设法的给他找一点娱乐活动,把我闲置的树莓派给他装了 ...
- 帝国cms 权限操作
<? if ($classid==5 || $classid==6 || $classid==7 || $classid==8 || $classid==9 || $classid==10 || ...
- 使用flex布局解决百分比高度元素垂直居中
方法一: align-self(解决父元素下面单个子元素布局方式) 父级加上 div{display:flex} 子元素 span { flex-grow: 1; align-self: center ...
- asp.net Core 2.0 MVC为Controller或Action添加定制特性实现登录验证
前言:最近在倒腾 微软的新平台 asp.net Core 2.0,在这个过程中有些东西还是存在差异.下面是我在学习过程的一点笔记.有不妥之处,望各位大虾指正! 一.先创建一个控制器继承于Control ...
- SSIS 初次接触 + 开发记录
第一次接触SSIS,昨天终于把一套流程走通,记一下流水. 1:安装 使用SSIS需要安装插件(VS 和Sql Server都需要另外安装). 自己使用的vs2017开发,官网有专门的 VS2017 安 ...
- app hellocharts 柱状图
app里有个告警数量的柱状图,有点小问题,y轴竟然不是整数 这个改起来到是简单 Axis yAxis = new Axis().setHasLines(true).setTextColor(Color ...
- css and canvas实现圆形进度条
进度条效果: 话不多说,上代码 使用css动画实现,看到一篇博客的启发,稍微修改了下, css实现的原理是用两个半圆一开始隐藏,再分别旋转180度,最后成为一个整圆 半圆效果,一开始右边的半圆在盒 ...
