# &: 都是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