6. Python的运算符

常用运算符

常用运算符详细介绍见下表:

运算符 名称 说明 示例
+ 两个对象相加
>>> 1+2 结果为 3      >>> 'ab'+'cd' 结果为 'abcd'
- 两个对象相减
>>> 2-1 结果为 1    >>> 1-2  结果为 -1
* 两个数相乘或重复字符
>>> 3*4 结果为 12    >>> "-"*6 结果为 '------'
** x**y 返回x的y次幂
>>> 3**4 结果为 81     pow(3,4) = 81
/ 除以 x/y x除以y
>>> 4/2 结果为 2.0    >>> 4.0/2  结果为 2.0
// 取整除 返回商的整数部分
>>> 4//2结果为2    >>> 4//3结果为1 >>> 4//3.0结果为1.0 >>> 4//2.0结果为2.0
% 取模 返回除法的余数
>>> 4%2.0结果为0.0    >>> 4%3.0结果为1.0    >>> 4%3结果为1    >>> 4%2结果为0
<< 左移 x<<y 把x的二进制数值左移y位
>>> 2<<1结果为4 >>> 2<<2结果为8
>> 右移 x>>y 把x的二进制数值右移y位
>>> 16>>1结果为8 >>> 16>>2结果为4 >>> 16>>3结果为2 >>> 16>>4结果为1
& 按位与 数的按位与(同时为1则为1,否则为0)  
| 按位或 数的按位或(只要有1则为1,否则为0)  
^ 按位异或 数的按位异或(异则为1,同则为0)  
~ 按位翻转 x的按位翻转为-(x+1)  

运算符有优先级,但建议使用圆括号来分组运算符和操作数,使程序尽可能的易读。

按位与、按位或、按位异或、按位翻转

下面详细介绍按位与、按位或、按位异或、按位翻转的求值过程。

分别求3与5,3与-5,-3与5,-3与-5的按位与、按位或、按位异或的值。

正数:

3的原码 = 反码 = 补码     [0000 0011]
5的原码 = 反码 = 补码     [0000 0101]

负数:

原码:
    -3的原码    [1000 0011]
    -5的原码    [1000 0101]
反码:原码符号位不变,其余各位取反
    -3的反码    [1111 1100]
    -5的反码    [1111 1010]
补码:原码符号位不变,其余各位取反,再加1(即原码的反码+1)
    -3的补码    [1111 1101]
    -5的补码    [1111 1011]

将补码放在一起,便于观察:

3    [0000 0011]
5    [0000 0101]
-3   [1111 1101]
-5   [1111 1011]

求值:

使用补码进行运算,最后结果还是补码:

                按位与             按位或             按位异或
数值3与5        [0000 0001]        [0000 0111]        [0000 0110]
数值3与-5       [0000 0011]        [1111 1011]        [1111 1000]
数值-3与5       [0000 0101]        [1111 1101]        [1111 1000]
数值-3-5      [1111 1001]        [1111 1111]        [0000 0110]

再根据补码求原码,先求反码,正数不变,负数符号位不变,其他取反:

                按位与             按位或             按位异或
数值3与5        [0000 0001]        [0000 0111]        [0000 0110]
数值3与-5       [0000 0011]        [1000 0100]        [1000 0111]
数值-3与5       [0000 0101]        [1000 0010]        [1000 0111]
数值-3-5      [1000 0110]        [1000 0000]        [0111 1001]

再根据补码求原码,正数不变,负数再+1:

                按位与               按位或               按位异或
数值3与5        [0000 0001]=1        [0000 0111]=7        [0000 0110]=6  
数值3与-5       [0000 0011]=3        [1000 0101]=-5       [1000 1000]=-8 
数值-3与5       [0000 0101]=5        [1000 0011]=-3       [1000 1000]=-8 
数值-3-5      [1000 0111]=-7       [1000 0001]=-1       [0000 0110]=6  

使用python执行命令验证:

按位与:
>>> 3&5
1
>>> 3&-5
3
>>> -3&5
5
>>> -3&-5
-7

按位或:
>>> 3|5
7
>>> 3|-5
-5
>>> -3|5
-3
>>> -3|-5
-1

按位异或:
>>> 3^5
6
>>> 3^-5
-8
>>> -3^5
-8
>>> -3^-5
6

下面对3,5,-3,-5求按位翻转的值。

刚刚已经获取了4个数的补码,如下:

将补码放在一起,便于观察:

3    [0000 0011]
5    [0000 0101]
-3   [1111 1101]
-5   [1111 1011]

按位反转后的补码:

3    [1111 1100]
5    [1111 1010]
-3   [0000 0010]
-5   [0000 0100]

求补码的反码,正数不变,负数符号位不变,其他位取反:

3    [1000 0011]
5    [1000 0101]
-3   [0000 0010]
-5   [0000 0100]

求补码的原码,正数不变,负数符号位不变,+1:

3    [1000 0100]=-4  
5    [1000 0110]=-6  
-3   [0000 0010]=2   
-5   [0000 0100]=4   

使用python执行命令验证:

>>> ~3
-4
>>> ~5
-6
>>> ~-3
2
>>> ~-5
4