龙空技术网

计算机中二进制的位操作

小码农和农夫 103

前言:

而今朋友们对“python的位运算”大致比较关注,你们都想要学习一些“python的位运算”的相关内容。那么小编也在网络上收集了一些对于“python的位运算””的相关资讯,希望小伙伴们能喜欢,各位老铁们快快来学习一下吧!

我们已经知道计算机是基于二进制实现操作计算机的源头是二进制,一些你不知道的知识。,我们来看看,计算机语言中针对二进制的位操作。这里的位操作,也叫作位运算,就是直接对内存中的二进制位进行操作。

其中二进制位操作主要分为:移位操作和逻辑操作。常见的二进制移位操作包括向左移位和向右移位,二进制逻辑操作有“或”“与”“异或”。下面我们一一来看。

向左移位

在不考虑数字溢出的情况下,二进制 111101 向左移一位,就是在末尾添加一位 0,因此 111101 就变成了 1111010.

什么是数字溢出?

定义:二进制数的位数超过了系统所指定的位数。

现在的操作系统至少支持32 位的整型数字,而 1111010 远远没有超过 32 位,所以不会发生溢出。

如果进行左移操作的二进制已经超出了 32 位,左移后数字就会溢出,需要将溢出的位数去除。

在这个例子中,如果将 1101010 换算为十进制,就是 106,你有没有发现,106 正好是 53 的 2 倍。所以,我们可以得出一个结论:二进制左移一位,其实就是将数字翻倍。

向右移位

二进制 110101 向右移一位,就是去除末尾的那一位,因此 110101 就变成了 11010(最前面的 0 可以省略)。我们将 11010 换算为十进制,就是 26,正好是 53 除以 2 的整数商。所以二进制右移一位,就是将数字除以 2 并求整数商的操作。

Python实现移位操作

下面我们来看看,用代码如何进行移位操作。

左移:

左移运算符 m << n 表示把 m 左移 n 位。在左移 n 位的时候,最左边的 n 位将被丢弃,同时在最右边补上 n 个 0 。比如:

00001010 << 2 = 00101000

10001010 << 3 = 01010000

Python 代码【结果有点不一样】:>>> bin(int('0b00001010', 2) << 2).replace('0b', '').zfill(8)'00101000'>>> bin(int('0b10001010', 2) << 3).replace('0b', '').zfill(8)'10001010000'>>> bin(-int('0b00001010', 2) << 2).replace('0b', '').zfill(8)'-0101000'

右移:

右移运算符 m >> n 表示把 m 右移 n 位。在右移 n 位的时候,最右边的 n 位将被丢弃。但右移时处理最左边位的情形要复杂一点。如果数字是一个无符号树值,则用 0 填补最左边的 n 位;如果数字是一个有符号数值,则用数字的符号位填补最左边的 n 位。也就是说,如果数字原先是一个正数,则右移之后在最左边补 n 个 0 ;如果数字原先是负数,则右移之后在最左边补 n 个 1 。

下面是对两个 8 位有符号数进行右移的例子:

00001010 >> 2 = 0000001010001010 >> 3 = 11110001Python 代码【结果有点不一样】:>>> bin(int('0b10001010', 2) >> 2).replace('0b', '').zfill(8)'00100010'>>> bin(int('0b10001010', 2) >> 3).replace('0b', '').zfill(8)'00010001'>>> bin(-int('0b10001010', 2) >> 3).replace('0b', '').zfill(8)'-0010010'
位的“或”

二进制的“1”和“0”分别对应逻辑中的“真”和“假”,因此可以针对位进行逻辑操作。

逻辑“或”的意思是,参与操作的位中只要有一个位是 1,那么最终结果就是 1,也就是“真”。如果我们将二进制 110101 和 100011 的每一位对齐,进行按位的“或”操作,就会得到 110111。

位的“与”

同理,我们也可以针对位进行逻辑“与”的操作。“与”的意思是,参与操作的位中必须全都是 1,那么最终结果才是 1(真),否则就为 0(假)。如果我们将二进制 110101 和 100011 的每一位对齐,进行按位的“与”操作,就会得到 100001。

位的“异或”

逻辑“异或”和“或”有所不同,它具有排异性,也就是说如果参与操作的位相同,那么最终结果就为 0(假),否则为 1(真)。所以,如果要得到 1,参与操作的两个位必须不同,这就是此处“异”的含义。我们将二进制 110101 和 100011 的每一位对齐,进行按位的“异或”操作,可以得到结果是 10110。

标签: #python的位运算