python的位运算

# &: 都是1,才为1,否则为零
# |: 都是0,才为0,否则为1
# ^: 相同为0,相异为1

a = bin(20)
b = bin(16)
print(a)  # 0b10100
print(b)  # 0b10000

# 都为1,才为1
# 因此结果是0b10000
print(20 & 16)  # 16

# 0b10100
print(20 | 16)  # 20

# 0b00100
print(20 ^ 16)  # 4


# >> n 表示右移n位,相当于除以2**n
print(100 >> 2)  # 25
print(100 / (2**2))  # 25.0

# << n 表示左移n位,相当于乘以2**n
print(20 << 2)  # 80
print(20 * (2**2))  # 80


# 如果一个字节中的后四位的值,比如01001101
# 那么只需让01001101对应的值和00001111的值(这里是15)做一个与运算,计算哪几位,哪几位就为1,其余的补0
# 我要是计算后7位呢,那么显然和01111111做一个与运算,显然这里是127

# 要是计算某一位的值,比方说第1位,那么计算的时候右移7位就行了。此时第1位处于最后一位。


# 关于左移和右移
# 11111111,右移,那么移出的部分不要,高位补0,00001111
# 11111111,左移,低位补0,高位保留,111111110000

  

补充:

# 假设用两个字节表示数字
# 1用二进制表示0000 0000 0000 0001
# -1用二进制表示1000 0000 0000 0001
# 那帮计算机科学家们秉承着能少用内存就少用的精神,让最高位表示符号位。0为正,1为负
# 1 = 0000 0000 0000 0001
# -1= 1000 0000 0000 0001
# 将两者相加 1 + -1 = 1000 0000 0000 0010,结果变成-2了。
# 这是为什么?
# 因为在计算机中,数字相加,其实是将补码进行相加,什么叫补码
# 正数--->原码=反码=补码
# 负数--->反码=原码的符号位不变,其他位取反
        # 补码=反码 + 1


# 再来计算一下
# 原码:1000 0000 0000 0001
# 反码:1111 1111 1111 1110 ,符号位不变,其他的位取反,0变1,1变0
# 补码:1111 1111 1111 1111 , 反码 + 1

# 正数的原码等于反码等于补码
# 因此将补码进行相加 1 + -1 = 0000 0000 0000 0000,逢二进一,前面多出去的一位不用管了,不在范围内

# 关于取反操作
print(~9)  # -10
# 这里的结果为什么是-10,难道不应该是-9吗?
# 首先 9 --> 0000 1001,原码反码补码都是它
# 如果取反,表示对补码取反,因为在运算的过程中,都是对补码进行运算
# 0000 1001 取反之后 1111 0110得到取反之后的补码
# 刚说过,运算的时候使用补码,但是在展示给程序猿来看的时候用的还是原码,所以还要将补码转换成原码
# 所以符号位不变其他位取反,得到了反码,1000 1001
# 最后别忘了+1,--> 1000 1010,结果是-10

  

    原文作者:古明地盆
    原文地址: http://www.cnblogs.com/traditional/p/9371743.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞