Python 位操作符(Bitwise)
按位运算符用于对二进制模式(1和0)执行操作。当您在屏幕上执行2 + 3的整数运算时,计算机将以二进制形式读取它-2表示为10,而3表示为11以二进制格式。因此,您的计算将看起来像10 + 11 = 101
按位运算符乍一看可能令人生畏,因为它们将所有内容都转换为位,并且我们不习惯于1和0。但是,一旦您了解了它们,就可以很容易地对其进行操作。接下来,让我们看一个例子
3 x 2 = 6如果您以二进制格式执行相同的操作
011 x 10 = 110
如果您注意到,当我们将某物乘以2时,我们只需要向左移动一个。因此,011将变为110。
同样,0010将变为0100。现在您知道了,您能看到乘以2有多么容易吗?如果我们除以2,会有任何猜测吗?好吧,你猜对了,而不是左移,我们将有右移。因此,使对位进行这些操作的运算符称为按位运算符。随后,我们将在本教程的后半部分详细了解这些左移和右移。
在继续进行之前,让我们找出为什么按位运算符必不可少的原因。此外,我们还将理解为什么我们需要学习它们。
现在,您会想知道是否需要进行按位运算。到目前为止,算术运算运行良好。促使您使用按位运算符的一些原因是:
执行速度:到目前为止,我们已经知道,计算机(准确地说是编译器)会将所有内容更改为1和0。那么,为什么不减轻系统负担呢?由于我们现在拥有高级处理器,因此您将不会在常规操作中看到这种差异。但是,如果您正在处理嵌入式系统程序,这将变得很重要。
操作位:很多时候,在嵌入式系统上工作时,您需要操作某些位。
例如,在序列111011中,如果您想知道具有0的位,则可以使用按位运算符(我们将在稍后介绍如何实现)进行操作。
错误检查:在错误检查中广泛使用按位运算符。如果将某些位发送到另一台服务器上的另一台计算机,则容易出错。随后,您可以使用按位运算符识别它们。这对于嵌入式系统很重要,而python是最重要的选择之一。
到现在为止,您已经对我们为什么需要按位运算符有了很好的了解。随后,让我们继续逐位运算符的类型。
Python提供了一些有用的运算符来执行按位运算。随后,让我们详细了解这些。
&(AND)运算符用于执行两位之间的AND。此外,AND的简单规则是,如果所考虑的两个位均为1,则答案为1,否则为0。
1&1 = 1
1&0 = 0
0&0 = 0
0&1 = 0
现在,您可以尝试11和01吗?希望您得到的答案是01。
此外,我们在前面讨论了如何查找哪个位的值为0。这是使用AND操作完成的。
如果您将一个数字与11111111(现在为1个字节)进行与运算,如果结果位为0,则该位置会发生错误。
在下面的计算中,我们在Python中使用&按位运算符对100和101进行运算。您已经知道代表一个二进制数,我们给它加上0b前缀。
因此,您可以直接在编辑器(本机或云)中编写以下语句,然后运行以获取输出。如果您熟悉本机IDE,则可以下载PyCharm,否则也可以使用基于云的编辑器Repl。随后,在本文中,我们将使用Rep.it
在编辑器中执行以下代码:
打印(0b100&0b101)
注意:100是二进制格式的4,而101是5。此外,前缀0b表示我们引用的是二进制值,而不是十进制的100和101。
正如预期的那样,我们得到的结果为4。您必须注意,即使我们以二进制形式执行计算,结果仍然以十进制表示。此外,这是编程语言中的默认行为。此外,如果没有显式引用关键字,结果将以十进制表示。
正如我们引用0b表示输入中的二进制一样,要获取二进制输出,我们需要提及“ bin ”关键字。
随后,执行以下命令以获取相同的二进制结果:
打印(bin(0b100&0b101))
这将带来以下结果:
更多示例:
12和14 = 1100和1110 = 1100 = 12
23&15 = 10111&01111 = 00111 = 7
10&12 = 1010&1100 = 1000 = 8
| (OR)运算符用于对两位执行“或”运算。此外,OR的简单规则是,当且仅当所考虑的两个位均为0时,结果位才为0,否则结果为1。
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
在下面的示例中,我们将数字5(101)与4(100)进行运算,并期望答案为101(5),它只是具有0的中间位。
不出所料,答案5 | 4是5。
更多示例:
12 | 14 = 1100 | 1110 = 1110 = 14
23 | 15 = 10111 | 01111 = 11111 = 31
10 | 12 = 1010 | 1100 = 1110 = 14
〜(NOT)运算符是一个非常简单的运算符,其作用与名称相同。此外,它将位从0翻转为1,从1翻转为0。但是在像Python这样的编程中使用时,此运算符用于返回number的补码。
因此,〜10 = -11而不是01。此外,必须具有1的补码和2的补码的先验知识,才能在这里理解此运算符的作用。
要理解这个概念,您应该知道python返回数字的2的补码。该数字的2的补数是〜(num + 1)。
因此,〜10返回为〜(10 +1)。这就是您所需要知道的。只要记住快捷方式〜(num + 1)
在编辑器中执行以下代码,以验证输出未进行24(11000)操作
打印(不是(0b11000))
答案是预期的-25。
更多示例:
〜13(0b01101)= -14
〜16(0b010000)= -17
〜31(0b011111)= -32
^(XOR)运算符用于对两个正在运算的位进行XOR。XOR操作非常简单。如果两个位相同,则结果位为0,否则为1。
1 ^ 1 = 0
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0
因此1010 ^ 1011将产生0001。
下面通过执行以下几行来演示相同的内容:
打印(0b1010 ^ 0b1011)
XOR运算符在计算机科学和嵌入式系统领域中非常有用。它在逻辑计算中被广泛使用,以使过程更快。例如,如您在上面看到的,对它们执行XOR时10和11的结果为1。因此,如果我想找出两个数字是否连续,可以对它们进行异或运算,然后检查结果是否为1。
更多示例:
12 ^ 14 = 1100 ^ 1110 = 0010 = 2
23 ^ 15 = 10111 ^ 01111 = 11000 = 24
10 ^ 12 = 1010 ^ 1100 = 0110 = 6
顾名思义,<< <<(按位向左移位)运算符将位向左移动至该运算符右侧表示的数字。
例如,1 << 2将向左移动1以获得2个值。按位表示,它将显示如下:
1 = 0001。
1 << 2: 0001 << 2 = 0100即4。
执行下面给出的代码,以在结果中看到相同的结果:
打印(0b0001 << 2)
如预期的那样,1 << 2的答案是4。
更多示例:
14 << 1 = 01110 << 1 = 11100 = 28
24 << 4 = 000011000 << 4 = 110000000 = 384
19 << 3 = 00010011 << 3 = 10011000 = 152
到现在为止,您将已经知道,当在编辑器中表示二进制数字时,在执行上述代码之前,需要将前缀0b前缀。
顾名思义,>>(右移)运算符会将位向右移至表示在运算符右侧的数字。
例如,10 >> 2将使位(1010)向右移动2。
10 = 1010
10 >> 2:1010 >> 2 = 0010 = 2
让我们通过执行以下几行来确认相同的内容:
打印(0b1010 >> 2)
不出所料,答案是10 >> 2是2。
更多示例:
14 >> 1 = 01110 >> 1 = 00111 = 7
24 >> 4 = 000011000 >> 4 = 00001 = 1
19 >> 3 = 00010011 >> 3 = 000010 = 2
这使我们结束了学习Python或与此相关的任何编程语言的按位运算符的过程。按位运算符的关键只是不知道它们的定义,而是能够在您的程序中实现它们。为了提高按位运算符的效率,请使用位操作进行大量练习,并探讨它们在不同情况下的行为。一旦掌握了这些操作员,它们便是解决问题的最好,最快的方法。
对于您的实践,我已经提到了使用本文中讨论的运算符进行的一些操作。这些操作数尚未写入位,因为对其进行探索将有助于您掌握概念。
执行以下操作并分析,探索和观察结果。
35和27
-23 | 23
18 >> 5
-43 << 3
17 ^ 42
关键要点:
按位运算符是使用诸如Python之类的编程语言在位级别上运行的运算符。
此外,按位运算符在嵌入式系统,网络基础结构和编程中得到了广泛的应用。
此外,按位运算符提供更快,节省空间和错误检查方法。
python中使用的按位运算符为:
AND运算符。
OR运算符。
NOT运算符。
XOR运算符。
左移运算符。
右移运算符。