【Python入门】Python基础——位运算(操作二进制/原、反、补码)

本篇主要介绍何为位运算以及一些有关原、反、补码的介绍。

目录

前言

一、原、反、补码

1.1 为什么会有原、反、补码

1.2 如何转换

二、位运算

2.1 按位与 &

2.2 按位或 |

 2.3 异或 ^

2.4 取反 ~

2.5 左移位和右移位<<、>>

总结


前言

        对于我们的计算机来说,计算机是只能识别二进制的,采用二进制的方式可以使我们的逻辑运算更加简单,同时计算机是由逻辑电路组成,而逻辑电路正好只有两个状态,一个开一个关,而在二进制中也只有0和1,正好与计算机的物理部件相对应。而位运算是直接对二进制进行运算的,通过位运算我们可以实现一些功能,在下面我会详细进行讲解。


一、原、反、补码

1.1 为什么会有原、反、补码

计算机都是通过二进制数进行存储的,但是在进行实际运算的时候,负数是不好运算的所以我们需要把负数转成正数进行存储,这样在计算机中就只需要一套加法就能进行运算了。

对于正数而言,直接转为二进制数就可以进行存储了。但是对于负数而言,我们需要进行转换。

一般二进制数有8位的话,规定为第一位为符号位,0表示整数,1表示负数。

1.2 如何转换

正数的原、反、补都是其二进制数本身。

对于负数而言,我们先将其正数转换为二进制数,然后求其反码,也就是符号位不变,其他位取反,0变1,1变0。求出反码之后,再求其补码,即最后一位+1,如果为1就往前面进一位,1+1变0,前面是0的话,就变1。

例:求-21的原、反、补码

原码:1 0010101(第一位为符号位)

反码:1 1101010(符号位不变,其余位取反)

补码:1 1101011(最后一位+1,遇到1往前进一位,直到遇到0,0变1)

二、位运算

2.1 按位与 &

按位与其实和我们的逻辑与有异曲同工之妙,逻辑与(and)是都为真的时候,结果才为真。

按位与(&)是都为1的时候,结果才为1。

print(45&-21)

>> 41

进程已结束,退出代码0

其中45的原码是:00101101

-21的原码是:1 0010101

但是在计算机中因为-21是负数,所以应转为补码进行运算,其补码为:1 1101011

对其进行逻辑与运算,即1和1为1,其余为0,也就是00101001,即45。

2.2 按位或 |

按位或与逻辑或也有些相似,逻辑或是有1就是真,按位或也是如此,有1结果就为1。

接上例:

print(45|-21)

>> -17

进程已结束,退出代码0

45的原码是:00101101

-21的补码是:1 1101011

【Python入门】Python基础——位运算(操作二进制/原、反、补码)_第1张图片


在这里尤其需要注意一下,因为通过按位与求出的值是一个负数,而负数在计算机中是用补码存储了,因此这里需要求出它的原码,先求反码-1再求原码取反。

在位运算中,符号位也是需要参加运算的。

 2.3 异或 ^

异或就是两位相同为0,不同为1.

print(45^-21)

>> -58

进程已结束,退出代码0

45的原码是:00101101

-21的补码是:1 1101011

通过按位与和按位或的例子,相信大家也应该知道如何计算了,这里为了节省时间,避免重复,将简化描述。

简单来说,两位相同为0,不同为1。也就是:0001|0001=0001,0001|0000=0001,0000|0000=0000

如果符号位为负数,再按照补、反去求他的原码,从而求出值。

2.4 取反 ~

取反就是1变0,0变1

print(~6)

>> -7

进程已结束,退出代码0

 【Python入门】Python基础——位运算(操作二进制/原、反、补码)_第2张图片

 从上计算中不难看出,其实取反和取反码是有一定差别的取反是对所有位进行取反,包括符号位,但是取反码是不对符号位进行操作的。因为取反之后的符号位为1是负数,所以因此也是需要进行补、反一系列操作的。

2.5 左移位和右移位<<、>>

左移位<<:各二进位全部左移,高位丢弃,低位补0。

右移位>>:各二进位全部右移,对于无符号数,高位补0,有符号数(1),右移补1。

语法格式为:n<<(>>)k(k表示左(右)移多少位).

对于正数的移位,只需要按照相应的法则移位就行,最后结果直接转为10进制数。

对于负数的移位,需要先求其原码,但是在计算机中是对补码进行存储并且操作的,所以需要把原码转为反码再转为补码,然后进行移位,如果为负数,那么右移几位,就补几位1,然后得到其补码,再经过补、反码(-1,、取反)操作得到其十进制数。

例如,求-7<<1:

print(-7<<1)

>> -14

进程已结束,退出代码0

【Python入门】Python基础——位运算(操作二进制/原、反、补码)_第3张图片

 求-7>>1:

print(-7>>1)

>> -4

进程已结束,退出代码0

【Python入门】Python基础——位运算(操作二进制/原、反、补码)_第4张图片

总结

1、计算机都是以2进制数进行存储的

2、位运算是操作2进制数的

3、二进制数最高位是符号位,0表示正,1表示负

4、正数的原反补码都是其本身二进制数,负数的原码为正数原码,但是最高位符号位是1,反码除了符号位以外其他数取反,补码进行+1操作,满2往前进1

5、取反和取反码有区别,取反是所有位取反,取反码是除符号位以外的数取反

6、对负数进行位运算的时候,都是针对于补码进行运算的,运算后的结果需要转为原码再转为十进制数。

你可能感兴趣的:(Python,python,开发语言)