python基础7:逻辑运算 与 位运算(note与运算巧用方法)

一、逻辑运算规则:
从左向右依次运算至倒数第二个元素,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 (# 0and运算第一个导致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 (# 0and运算第一个导致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=00^1=11^0=11^1=0。 即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

运算法则:
交换率:a^b=b^a
结合率:(a^b)^c=a^(b^c)
自反性:a^b^a=b^a^a=b
其它:a^0=aa^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 = 11 & 0 = 00 & 1 = 00 & 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)

参考:
按位与、或、异或等运算方法

Python获取数字的二进制值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章