python运算符之按位操作

python中按位操作主要有以下几种:》》》


什么是按位操作?

python中除了支持一般的数学运算(加减乘除法等),也支持像C语言
中大多数数学表达式。这包括那些==把整数作为二进制位串处理的运算
==(如果你的python代码必须处理像网络数据包、串行端口或C程序生产的打包二进制数据的这些内容,就会非常有用)


按位或 x | y

按位或 又称集合并集。

整数1的二进制字符串是’0b1’

>>> x = 1
>>> bin(x)
'0b1'

整数2的二进制字符串是’0b100’

>>> y = 4
>>> bin(y)
'0b100'

所以按位或 x | y 的二进制 字符串是’0b101’

>>> x | y
5
>>> bin(x | y)
'0b101'

直接观察 x和y的整数值 1 | 4 = 5,难道 | 和 +号一样?
那换一个数字测试下:

>>> 5 | 7
7
>>> print(bin(5), bin(7), bin(5 | 7))
0b101 0b111 0b111

5 | 7 = 7 似乎没有规律。
这时会想到,按位操作本来就是针对二进制字符串的,那比较一下二进制字符串的关系

bin(5) = 0b101
bin(7) = 0b111
学过二进制运算法则的:可以发现如下规律:

参加运算的两个对象,按二进制位进行“或”运算。
运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :参加运算的两个对象只要有一个为1,其值为1。否则为0。

101 | 111 = 111
第一位是1 和 1所以还是 1,第二位 0 和 1所以还是1,第三位是 1 和 1所以还是1 结果 111。

(ps:之前的例子 1 | 4
bin(1)=1 bin(4)=101
当位数不一样时,少的字符串前面补0,也就是1等于0001)

所以之所以叫按位按位或是有真为真,同假为假。 二进制中1为真,0为假


按位与 x & y

按位与和按位或相似,但是 按位与是 同真为真,有假为假.

x = 2 y = 5 求 x & y

>>> x = 2; y =5
>>> x & y
0
>>> print(bin(2), bin(5))
0b10 0b101

两个位数不一样长,所以10前面补0,所以bin(2) = 0b010
比较010 和 101, 左边第一位一个0一个1所以结果为0,第二位一个0一个1所以结果为0,第三位一个0一个1所以结果为0,所以

010 & 101 = 0


按位异或 x ^ y

按位异或,是相同为假,不同为真.
010 ^ 100 = 110

>>> bin(2);bin(4)
'0b10'
'0b100'
>>> bin(2^4)
'0b110'

可以发现左边第一位一个是0一个是1所以为1,第二位不相同所以为1,最后一位相同所以为0


按位非(取反码) ~ x

在介绍按位异或前先介绍按位非

关于反码的详细内容:详情看这里:

https://www.imooc.com/article/16813?block_id=tuijian_wz

总结一下:0的反码和补码还是0

>>> bin(-0)
'0b0'

正整数补码=原码,负整数补码=原码符号位不变,其他位按位取反加1

并且所有的数据是以补码的形式储存的
所以~a = -a-1 按位取反是的值是原整数取负数-1

>>> ~111
-112
>>> ~-12
11

按位移动x >> y, x << y

按位移动有两种,一种是整数按位向右移动

1001 向右按位移动两位

>>> 0b1001 >> 2
2
>>> bin(2)
'0b10'

所以按位向右移动就是删除x 二进制字符串结尾后y位

下面是按位向左移动

0001向右按位移动两位

>>> 0b1 << 2
4
>>> bin(4)
'0b100'

所以按位向左移动就是在x二进制字符串结尾添加y个0

=====================================================

如果觉得我的文章对你有帮助的,麻烦动动你的小手,关注支持一波!谢谢啦

########################################################

猜你喜欢

转载自blog.csdn.net/qq_43582207/article/details/107627791
今日推荐