一、逻辑运算规则:
从左向右依次运算至倒数第二个元素,and运算执行判断非空到and运算的最后一个并返回最后一个非空(若执行到and运算最后一个后整个逻辑值为False,则返回第一个导致False的元素),or运算只需要执行至倒数第二个元素后非空(最后一个为or运算)则返回最后一个or运算的左边字符
'a' and 0 and 'b' and 'c' or 'd'
Out[10]: 'd'
'a' and 0 and 'b' and 'c'
Out[11]: 0
'a' and 0 and 'b' and None and 'c'
Out[12]: 0
0 and 'a' or 'b'
Out[14]: 'b'
1 and 'a' or 'b'
Out[15]: 'a'
'a' and 0 and 'b' and None and 'c'
# 运算路径:
'a' and 0 ---> False (# 0为and运算第一个导致False的元素,若整个表达式为False,则返回0)
False and 'b' ---> False
False and None ---> False
False and 'c' ---> False (# 整个表达式的结果为False)
'a' and 0 and 'b' and 'c' or 'd' and 'e' or 'f'
out: 'e'
# 运算路径:
'a' and 0 ---> False (# 0为and运算第一个导致False的元素,若整个表达式为False,则返回0)
False and 'b' ---> False
False and 'c' ---> False
False or 'd' ---> True
True and 'e' ---> True
True or 'f' ---> True (# 最后一次为or运算,True非空即可直接返回,or运算实际不会执行)
二、位运算规则
- 异或运算符(
^
):^
/__xor__
/bitwise_xor
- 按位与运算符(
&
):&
/__and__
/bitwise_and
- 按位或运算符(
|
) - 取反运算符(
~
) - 左移运算符(
<<
) - 右移运算符(
>>
)
1、异或运算
原理:
参加运算的两个数据,按二进制位
进行“异或”运算。运算规则遵循 0^0=0
; 0^1=1
; 1^0=1
; 1^1=0
。 即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
运算法则:
交换率:a^b=b^a
结合率:(a^b)^c=a^(b^c)
自反性:a^b^a=b^a^a=b
其它:a^0=a
, a^a=0
>>> bin(int('00000101', 2) ^ int('00001101', 2))
'0b1000'
>>> format(0b1000,'b')
'1000'
>>> int('00000101', 2),int('00001101', 2),int('1000', 2)
(5, 13, 8)
import numpy as np
a = np.array([0,1,-2,3,4])
b = np.array([-5,6,7,8,-9])
c = a ^ b
#c = a __xor__ b
print(a,b,c, sep='\n')
c_upzeros = np.take(c, np.where(c < 0)) # numpy.take()和numpy.where()用法
print(c_upzeros)
print(np.where(c < 0)) # 下标数组 (array([0, 2, 4], dtype=int64),)
print(np.where(c < 0)[0]) # [0 2 4]
2、取反运算符
原理:
按二进制位进行“取反”运算,运算规则:~1=0
; ~0=1
。对一个二进制数按位取反,即将0变1,1变0。
NOTE: 使一个数的最低位为零,可以表示为:a&~1
~1的值为1111111111111110,再按“与”运算,最低位一定为0。因为“~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。
3、与运算
原理:
按二进制位
进行“异或”运算。运算规则遵循: 1 & 1 = 1
; 1 & 0 = 0
; 0 & 1 = 0
; 0 & 0 = 0
。全为1则为1。
判断一个数是不是 2^n 的实现思路:
2^0 1 00000001 -1 --> 00000000
2^1 2 00000010 -1 --> 00000001
2^2 4 00000100 -1 --> 00000011
2^3 8 00001000 -1 --> 00000111
2^4 16 00010000 -1 --> 00001111
...
按位与运算实现方法:if a & (a-1) == 0
then a == 2^n (耗时短)
实现思路:转化为二进制
后进行按位与运算
思路联想:1000个瓶子c有1瓶毒药,用10只小白鼠试药的方法:将1~1000的十进制数字转换为二进制数字
# 筛选出 2^n
d = np.arange(1,25)
e = d & (d - 1)
print(e)
f = d[d & (d - 1) == 0] # 结果:2^n的数 [ 1 2 4 8 16]
#print(d[e == 0])
print(f)
参考:
按位与、或、异或等运算方法