Numpy 位運(yùn)算
在Numpy中,以 bitwise_ 開頭的函數(shù)是位運(yùn)算函數(shù)。Numpy 位運(yùn)算包括以下幾個函數(shù):
函數(shù) | 描述 |
---|---|
bitwise_and | 對數(shù)組元素執(zhí)行位與操作 |
bitwise_or | 對數(shù)組元素執(zhí)行位或操作 |
invert | 按位取反 |
left_shift | 向左移動二進(jìn)制表示的位 |
right_shift | 向右移動二進(jìn)制表示的位 |
1. 位運(yùn)算
與普通運(yùn)算不同,位運(yùn)算是發(fā)生在二進(jìn)制形式之間的,因此在演示位運(yùn)算之前,先將數(shù)據(jù)進(jìn)行十進(jìn)制到二進(jìn)制的轉(zhuǎn)換。
1.1 numpy.bitwise_and函數(shù)
numpy.bitwise_and 函數(shù)對數(shù)組中整數(shù)的二進(jìn)制形式執(zhí)行位與運(yùn)算。
案例
查看兩個整數(shù)的位與運(yùn)算結(jié)果:
a, b = 13, 17
print(np.bitwise_and(a, b))
打印結(jié)果為:
1
先看看a和b的轉(zhuǎn)換為二進(jìn)制的結(jié)果:
print("a 的二進(jìn)制為:", bin(a))
print("b 的二進(jìn)制為:", bin(b))
打印結(jié)果為:
a 的二進(jìn)制為: 0b1101
b 的二進(jìn)制為: 0b10001
a和b的位與運(yùn)算可以用下表來說明:
a | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|
b | 1 | 0 | 0 | 0 | 1 |
AND | 0 | 0 | 0 | 0 | 1 |
00001 轉(zhuǎn)化為 2 進(jìn)制為 1。
1.2 numpy.bitwise_or 函數(shù)
numpy.bitwise_or 函數(shù)對數(shù)組中整數(shù)的二進(jìn)制形式執(zhí)行位或運(yùn)算。
案例
查看兩個整數(shù)的位或運(yùn)算結(jié)果:
print(np.bitwise_or(a, b))
打印結(jié)果為:
29
a和b的位或運(yùn)算可以用下表來說明:
a | 0 | 1 | 1 | 0 | 1 |
---|---|---|---|---|---|
b | 1 | 0 | 0 | 0 | 1 |
OR | 1 | 1 | 1 | 0 | 1 |
11101轉(zhuǎn)化為十進(jìn)制是24+23+22+1=29
1.3 numpy.invert函數(shù)
numpy.invert函數(shù)對數(shù)組中整數(shù)進(jìn)行位取反運(yùn)算,即 0 變成 1,1 變成 0。
對于有符號整數(shù),取該二進(jìn)制數(shù)的補(bǔ)碼,然后 加1。二進(jìn)制數(shù),最高位為0表示正數(shù),最高位為 1 表示負(fù)數(shù)。
如下是 ~1 的計算步驟:
- 將**
1
**(這里叫:原碼)轉(zhuǎn)二進(jìn)制 =00000001
; - 按位取反 =
11111110
; - 發(fā)現(xiàn)符號位(即最高位)為**
1
**(表示負(fù)數(shù)),將除符號位之外的其他數(shù)字取反 =10000001
; - 末位加1取其補(bǔ)碼 =
10000010
; - 轉(zhuǎn)換回十進(jìn)制 =
-2
。
案例
print('1的二進(jìn)制表示', np.binary_repr(1, width = 8))
print('1的位反轉(zhuǎn)為', np.invert(1))
打印結(jié)果為:
1的二進(jìn)制表示 00000001
1的位反轉(zhuǎn)為 -2
1.4 numpy.left_shift 函數(shù)
numpy.left_shift 函數(shù)將數(shù)組元素的二進(jìn)制形式向左移動到指定位置,右側(cè)附加相等數(shù)量的 0。
案例
print('10的二進(jìn)制表示:', np.binary_repr(10, width = 8))
print('10左移2位的結(jié)果:', np.left_shift(10, 2))
打印結(jié)果為:
10的二進(jìn)制表示: 00001010
10左移2位的結(jié)果: 40
查看 40 的二進(jìn)制:
print('40的二進(jìn)制表示:', np.binary_repr(40, width = 8))
40的二進(jìn)制表示: 00101000
綜合比較 10 和 40 的二進(jìn)制轉(zhuǎn)換結(jié)果,可以直觀了解 numpy.left_shift 函數(shù)的運(yùn)算過程。
1.5 numpy.right_shift函數(shù)
numpy.right_shift 函數(shù)將數(shù)組元素的二進(jìn)制形式向右移動到指定位置,左側(cè)附加相等數(shù)量的 0。
案例
print('40的二進(jìn)制表示:', np.binary_repr(40, width = 8))
print('40右移2位的結(jié)果:', np.right_shift(40, 2))
打印結(jié)果為:
40的二進(jìn)制表示: 00101000
40右移2位的結(jié)果: 10
查看 40 的二進(jìn)制:
print('10的二進(jìn)制表示:', np.binary_repr(10, width = 8))
10的二進(jìn)制表示: 00001010
綜合上述步驟,可以直觀了解numpy.left_shift函數(shù)的運(yùn)算過程。
2. 小結(jié)
本小節(jié)講解了 Numpy 中常用的位運(yùn)算,與普通運(yùn)算不同,位運(yùn)算是發(fā)生在二進(jìn)制形式之間的,讀者可通過觀察二進(jìn)制的轉(zhuǎn)化過程進(jìn)行學(xué)習(xí)。