python运算符详解(二)

简介: python运算符详解(二)

python运算符详解(一):https://developer.aliyun.com/article/1495699?spm=a2c6h.13148508.setting.14.163c4f0efRHJQa

(7)位运算符: & | ^ << >> ~

Python 位运算按照数据在内存中的二进制位(Bit)进行操作,它一般用于底层开发(算法设计、驱动、图像处理、单片机等),在应用层开发(Web 开发、Linux 运维等)中并不常见

存储和计算时,都用补码进行操作

var1 = 19
var2 = 15

# & 按位与
& 按位与运算符
按位与运算符&的运算规则是:只有参与&运算的两个位都为 1 时,结果才为 1,否则为 0。例如1&1为 1,0&0为 0,1&0也为 0,这和逻辑运算符&&非常类似。
计算方法,先将数字转换成二进制的补码,用补码进行按位与运算,符号位参与运算,之后将补码转换成原码显示

res = var1 & var2
"""
000 ... 10011
000 ... 01111
000 ... 00011 => 3
"""
print(res)

# | 按位或
| 按位或运算符
按位或运算符|的运算规则是:两个二进制位有一个为 1 时,结果就为 1,两个都为 0 时结果才为 0。例如1|1为 1,0|0为0,1|0 为1,这和逻辑运算中的||非常类似。

res = var1 | var2
"""
000 ... 10011
000 ... 01111
000 ... 11111
"""
print(res)

# ^ 按位异或
"""两个值不相同=>True 反之返回False"""
^按位异或运算符
按位异或运算^的运算规则是:参与运算的两个二进制位不同时,结果为 1,相同时结果为 0。例如0^1为 1,0^0为 0,1^1为 0。

res = var1 ^ var2
"""
000 ... 10011
000 ... 01111
000 ... 11100
"""
print(res)

#<< 左移 (相当于乘法)

<<左移运算符
Python 左移运算符<<用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补 0。
例如,9<<3可以转换为如下的运算:
<< 0000 0000 – 0000 0000 – 0000 0000 – 0000 1001 (9 在内存中的存储)
0000 0000 – 0000 0000 – 0000 0000 – 0100 1000 (72 在内存中的存储)
所以9<<3的结果为 72。

又如,(-9)<<3可以转换为如下的运算:
<< 1111 1111 – 1111 1111 – 1111 1111 – 1111 0111 (-9 在内存中的存储)
1111 1111 – 1111 1111 – 1111 1111 – 1011 1000 (-72 在内存中的存储)
所以(-9)<<3的结果为 -72



如果数据较小,被丢弃的高位不包含 1,那么左移 n 位相当于乘以 2 的 n 次方。 -9 * 2**3 = -72



"""5乘以2的n次幂"""
res = 5 << 1 # 10
res = 5 << 2 # 20
res = 5 << 3 # 40
print(res)

“”"

000 … 101 => 5

000 … 1010 => 10

000 …10100 => 20

000 .101000 => 40

“”"

#>> 右移 (相当于除法)

右移运算符

Python 右移运算符>>用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补 0 或 1。如果数据的最高位是 0,那么就补 0;如果最高位是 1,那么就补 1。

例如,9>>3可以转换为如下的运算:

0000 0000 – 0000 0000 – 0000 0000 – 0000 1001 (9 在内存中的存储)

0000 0000 – 0000 0000 – 0000 0000 – 0000 0001 (1 在内存中的存储)

所以9>>3的结果为 1。

又如,(-9)>>3可以转换为如下的运算:

1111 1111 – 1111 1111 – 1111 1111 – 1111 0111 (-9 在内存中的存储)

1111 1111 – 1111 1111 – 1111 1111 – 1111 1110 (-2 在内存中的存储)

所以(-9)>>3的结果为 -2

如果被丢弃的低位不包含 1,那么右移 n 位相当于除以 2 的 n 次方(但被移除的位中经常会包含 1)。

“”“5地板除2的n次幂”“”

res = 5 >> 1 # 2

res = 5 >> 2 # 1

res = 5 >> 3 # 0

“”"

000 … 101

000 … 010 => 2

000 … 001 => 1

000 … 000 => 0

“”"

print(res)

#~ 按位非 (针对于补码进行操作,按位取反,包含每一位)

~按位取反运算符

按位取反运算符为单目运算符(只有一个操作数),右结合性,作用是对参与运算的二进制位取反。例如1为0,~0为1,这和逻辑运算中的!非常类似。

""" -(n+1) """
# res = ~22
res = ~19
print(res)
"""
原码:000 ... 10011
反码:000 ... 10011
补码:000 ... 10011

补码:   000 ... 10011
按位非: 111 ... 01100

给你补码->原码
补码:111 ... 01100
反码:100 ... 10011
原码:100 ... 10100 => -20
"""

res = ~-19
print(res)
"""
原码:100 ... 10011
反码:111 ... 01100
补码:111 ... 01101

补码:   111 ... 01101
按位非: 000 ... 10010

给你补码->原码 (因为是正数 ,原反补相同)
000 ... 10010 => 18
"""

总结:

个别运算符:

运算符优先级最高的: **

运算符优先级最低的: =

()可以提升优先级

一元运算符 > 二元运算符 (优先级)

一元运算符 : 同一时间,操作一个值 ~ -

二元运算符 : 同一时间,操作两个值 + - * / …

同一种类运算符:

算数运算符 : 乘除 > 加减

逻辑运算符 : () > not > and > or

位运算符 : ( << >> ) > & > ^ > |

整体排序:

算数运算符 > 位运算符 > 比较运算符 > 身份运算符 > 成员运算符 > 逻辑运算符 >赋值

赋值运算符用来做收尾

算位比身成逻

res = 5+5 << 6 // 3 is 40 and False

Python 3.8(或更高)下:

出现报错

SyntaxWarning: "is" with a literal. Did you mean "=="?
1
解决方法:
将对应语句中is/is not用== 和 != 代替

原因:

从 python 3.8 开始,使用 is 和 is not 运算符时,会抛出 SyntaxWarning 语句警告信息

“”"

res = 10 << 2 is 40 and False

res = 40 is 40 and False

res = True and False

res = False

“”"

print(res)

优先级不是每个人都要熟记于心,为了便于新人理解,可用括号提升下优先级,这样就看起来比较直白

res = (5+5) << (6//3) is 40 and False

相关文章
|
1月前
|
Python
【10月更文挑战第7天】「Mac上学Python 14」基础篇8 - 运算符详解
本篇将详细介绍Python中的运算符,包括数学运算、关系运算、逻辑运算、赋值运算和成员运算等内容。同时会说明运算符的优先级和运算顺序,帮助用户理解和掌握Python中的运算符使用规则。
37 3
【10月更文挑战第7天】「Mac上学Python 14」基础篇8 - 运算符详解
|
1月前
|
自然语言处理 Python
【python从入门到精通】-- 第三战:输入输出 运算符
【python从入门到精通】-- 第三战:输入输出 运算符
65 0
【python从入门到精通】-- 第三战:输入输出 运算符
|
1月前
|
存储 Java 编译器
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。
这篇文章是关于Python编程语言中变量命名规则、基本数据类型、算数运算符、比较运算符、逻辑运算符、赋值运算符以及格式化输出与输入的详细教程。
18 0
Python学习三:学习python的 变量命名规则,算数、比较、逻辑、赋值运算符,输入与输出。
|
1月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (一)
Python操作:字符串--列表--元组--字典--运算符 (一)
|
1月前
|
Python
Python操作:字符串--列表--元组--字典--运算符 (二)
Python操作:字符串--列表--元组--字典--运算符 (二)
|
3月前
|
JavaScript 前端开发 开发者
如何在 Python 中使用三元运算符?
【8月更文挑战第29天】
35 3
|
3月前
|
算法 测试技术 Python
Python接口自动化测试框架(基础篇)-- 有点意思的运算符
这篇文章介绍了Python中的各种运算符,包括算术运算符、比较运算符、赋值运算符、逻辑运算符、成员运算符、位运算符和身份运算符,并讨论了运算符的优先级,以及序列类型的相关知识。
21 0
Python接口自动化测试框架(基础篇)-- 有点意思的运算符
|
3月前
|
Python
二:《Python基础语法汇总》— 输入与输出&运算符
【8月更文挑战第16天】本篇文章详细讲述了关于输入输出函数的语法及占位符;转义字符和运算符的使用,并附上详细的代码示例
35 2
|
4月前
|
Python
Python基础语法:运算符详解(算术运算符、比较运算符、逻辑运算符、赋值运算符)
运算符是Python编程中的重要组成部分,理解并熟练使用这些运算符有助于编写高效、简洁的代码。本文详细介绍了算术运算符、比较运算符、逻辑运算符和赋值运算符的使用方法,并通过综合示例展示了它们在实际编程中的应用。希望通过本文的介绍,您能更好地掌握Python中的运算符。
187 13
|
3月前
|
Python
Day 6/100:Python运算符
Day 6/100:Python运算符
31 0