位运算符(了解)
按位运算符是把数字看作是二进制来进行计算的。 下表中变量 a
为 60,b
为 13,二进制格式如下:
a = 0011 1100 # 60的二进制 b = 0000 1101 # 13的二进制
a & b = 0000 1100
a | b = 0011 1101
a ^ b = 0011 0001
~a = 1100 0011
位运算 | 描述 | 示例 |
& | 按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0 | (a & b) 输出结果 12 ,二进制解释:0000 1100 |
| | 按位或运算符:只要对应的两个二进位有一个为1时,结果位就为1 | (a | b) 输出结果 61 ,二进制解释:0011 1101 |
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释:0011 0001 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 | (~a) 输出结果 -61 ,二进制解释:1100 0011,在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0 |
a << 2 输出结果 240 ,二进制解释:1111 0000 |
>> | 右移动运算符:把 >> 左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 |
a >> 2 输出结果 15 ,二进制解释:0000 1111 |
练习
以下练习难度较高,只需要能看懂代码即可,不要求写出。
使用位运算,获取到十六进制颜色 0xF0384E
的RGB值,以十进制形式打印输出。
运算符优先级
当多种运算符做混合运算时,就会涉及到先运算哪个,后运算哪个问题。以下表格列出了从最高到最低优先级的所有运算符:
运算符 | 描述 |
** | 指数 (最高优先级) |
~ + - | 按位翻转, 一元加号和减号 |
* / % // | 乘,除,取模和取整除 |
+ - | 加法减法 |
>> << | 右移,左移运算符 |
& | 位 ‘AND’ |
^ | | 位运算符 |
<= < > >= | 比较运算符 |
<> == != | 等于运算符 |
= %= /= //= -= += *= **= | 赋值运算符 |
is is not | 身份运算符 |
in not in | 成员运算符 |
not and or | 逻辑运算符 |
练习
print(True or False and True) print(False or not False) print(True or True and False) a = 2 print(a ** 3 > 5 and a + 2 > 3 or a * 4 + 8 == 16 and not a == True and -a < 0)
总结:
在以后的实际开发中,如果有多种运算符进行混合运算时,强烈建议使用小括号来手动的控制运算符的优先级!
b = True or True and False # bad c = True or (True and False) # good