23.Python位运算符详解

位运算符通常在图形、图像处理和创建设备驱动等底层开发中使用。使用位运算符可以直接操作数值的原始 bit 位,尤其是在使用自定义的协议进行通信时,使用位运算符对原始数据进行编码和解码也非常有效。

位运算符对于初学者来说有些难度,因此初学者可先跳过本节内容。

位运算符的操作对象是整数类型,它会把数字看做对应的二进制数来进行计算。Python 支持的位运算符如表 1 所示。

表 1 Python位运算符
位运算符 说 明 使用形式 举 例
& 按位与 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 所示。

表 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 所示。

表 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 所示。

表 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 ~-5的运算过程(点此查看高清大图

通过图 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 次方(如果不能整除,实际返回的结果是小于除得结果数值的最大整数的)。不仅如此,进行位移运算只是得到了一个新的运算结果,而原来的操作数本身是不会改变的。

原文地址:https://www.cnblogs.com/youqc/p/12067870.html

时间: 2024-10-11 21:49:21

23.Python位运算符详解的相关文章

Java的位运算符详解实例

Java的位运算符详解实例——与(&).非(~).或(|).异或(^).右移(>>).左移(<<).无符号右移(>>>) 位运算符主要针对二进制, 它包括了:“与”.“非”.“或”.“异或”."右移"."左移"."无符号右移". 从表面上看似乎有点像逻辑运算符, 但逻辑运算符是针对两个关系运算符来进行逻辑运算, 而位运算符主要针对两个二进制数的位进行逻辑运算. 下面详细介绍每个位运算符. 1.与运

[转]Java的位运算符详解实例——与(&amp;)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面详细介绍每个位运算符. 1.与运算符与运算符用符号“&”表示,其使用规律如下:两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段.public class data13{public static void main(String[] args){int a=129;int b=128

python学习--运算符详解

一.简介 1.python 运算符分为 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 2.运算优先级 ** 指数 (最高优先级) ~ + - 按位翻转, 一元加号和减号 (最后两个的方法名为 [email protected] 和 -@) * / % // 乘,除,取模和取整除 + - 加法减法 >> << 右移,左移运算符 & 位 'AND' ^ | 位运算符 <= < > >= 比较运算符

位运算符详解

运算符   含义   &   按位与   |   按位或   ∧   按位异或   ∽   取反   <<   左移   >>   右移 说明: 1.位运算符中除∽以外,均为二目(元)运算符,即要求两侧各有一个运算了量. 2.运算量只能是整形或字符型的数据,不能为实型数据. “按位与”运算符(&) 规定如下: 0&0=0   0&1=0   1&0=0   1&1=1 例:3&5=?                      

Java的位运算符详解实例——与(&amp;)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:"与"."非"."或"."异或".从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面详细介绍每个位运算符. 1.与运算符 与运算符用符号"&"表示,其使用规律如下: 两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段. public class data13 { publ

6.Java逻辑运算符和位运算符详解

一.逻辑运算符 逻辑运算符共有三种,即“非”.“和”.“或”,分别用 " ! ".“&&”.“||”表示.其中: 非运算(!)表示否定,如:!true等于false.!false等于true.!2等于false.!0等于true. 和运算(&&)前后两个条件都为真时,才返回true,否则返回false. 或运算(||)前后两个条件有一个为真是,返回true,都为假时,返回false. public class data10{     public sta

PHP位运算符详解

位运算符 位运算符是指对二进制位从低位到高位对齐后进行运算. 符号 作用 举例 个人理解 & 按位与 $m & $n 全1为1,否则为0 | 按位或 $m | $n 全0为0,有1为1 ^ 按位异或 $m | $n 不同为1,相同为0 ~ 按位取反 ~$m << 向左移位 $m << $n >> 向右移位 $m >> $n &运算符 <?php $m = 1; $n = 2; $mn = $m & $n; echo $m

基础知识复习(一)——C语言位运算符详解

常用的位运算符:与(&),取反(~),或(|),异或(^),左移(«),右移(») 1. 与(&)操作符,按位与,全为1 时,结果取1 11001 &10011 结果:10001 2. 取反(~),为1,则取0,为0则取1,如: 10010 取反 01101 3. 或(|),两个数均为0时取0,其他情况为1 10010 11100 结果:11110 4. 异或(^),如果某位不同则取1,否则为0. 10010 11100 异或:01110 xor运算的逆运算是它本身,也就是说两次异

Java位运算符详解

# 前言 之前了解过位运算符,左移`>`等于除以2.但是我在看jdk源码的时候发现了一个`>>>`三个符号的,不明白这是什么意思,就去搜了一下,发现还挺多的知识点的,就整理了一下. 首先我们知道,我们编写的程序最终都是在计算机底层进行的,计算机底层也仅支持0.1两种符号.所以当时网上有个键盘只有0.1两个键,那才是大佬用的键盘.扯远了... 先来复习一下java的基本类型都占多少字节,占多少位(1字节等于8位): | 类型 | 字节数 | 位数 | 大小范围 | | -------