NumPy位運算
NumPy"bitwise_"開頭的函數是位運算函數。包括以下幾個函數:
函數 | 描述 |
---|---|
bitwise_and | 對數組元素執行位與操作 |
bitwise_or | 對數組元素執行位或操作 |
invert | 按位取反 |
left+shift | 向左移動二進制表示的位 |
right_shift | 向右移動二進制表示的位 |
注:也可適用“&”,“~”,“ | ”和“^”等操作符進行計算。
bitwise_and
import numpy as np
print('13和17的二進制形式:')
a,b = 13,17
print(bin(a),bin(b))
print('\n')
print('13和17的位與:')
print(np.bitwise_and(13,17))
13和17的二進制形式:
0b1101 0b10001
13和17的位與:
1
位與操作符的規律表格說明:
A | B | AND |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
bitwise_or
bitwise_or()函數對數組中整數的二進制形式執行位或運算。
import numpy as np
a,b = 13,17
print('13和17的二進制形式:')
print(bin(a),bin(b))
print('13和17的位或:')
print(np.bitwise_or(13,17))
13和17的二進制形式:
0b1101 0b10001
13和17的位或:
29
位或操作符的規律表格說明:
A | B | OR |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
invert
invert()函數對數組中整數進行位取反運算,即0變成1,1變成0。
對於有符號整數,取該二進制數的補碼,然後+1,二進制數,最高位爲0表示正數,最高位爲1表示負數。
~1的計算步驟:
- 將1(這裏叫:原碼)轉二進制 = 00000001
- 按位取反 = 111111110
- 發現符號位(即最高位)爲1(表示負數),將除符號之外的其它數字取反 = 10000001
- 末位加1取其補碼 = 10000010
- 轉換回十進制 = -2
表達式 | 二進制值(2的補數) | 十進制值 |
---|---|---|
5 | 00000000 00000000 00000000 0000010 | 5 |
~5 | 11111111 11111111 11111111 11111010 | -6 |
import numpy as np
print('13的位反轉,其中ndarray的dtype是uint8:')
print(np.invert(np.array([13],dtype = np.uint8)))
print('\n')
# 比較13和242的二進制表示,可以發現 位的反轉
print('13的二進制表示:')
print(np.binary_repr(13,width = 8))
print('\n')
print('242的二進制表示:')
print(np.binary_repr(242,width = 8))
13的位反轉,其中ndarray的dtype是uint8:
[242]
13的二進制表示:
00001101
242的二進制表示:
11110010
left_shift
left_shift()函數將數組元素的二進制形式向左移動到指定位置,右側附加相等數量的0.
import numpy as np
print('將10左移兩位:')
print(np.left_shift(10,2))
print('\n')
print('10的二進制表示:')
print(np.binary_repr(10,width = 8))
print('\n')
print('40的二進制表示:')
print(np.binary_repr(40,width = 8))
# '00001010'中的兩位移動到了左邊,並在右邊添加了兩個0
將10左移兩位:
40
10的二進制表示:
00001010
40的二進制表示:
00101000
right_shift
right_shift()函數將數組元素的二進制形式向右移動到指定位置,左側附加相等數量的0.
import numpy as np
print('將40右移兩位:')
print(np.right_shift(40,2))
print('\n')
print('40的二進制表示:')
print(np.binary_repr(40,width = 8))
print('\n')
print('10的二進制表示:')
print(np.binary_repr(10,width = 8))
# '00001010'中的兩位移動到了右邊,並在左邊添加了兩個0.
將40右移兩位:
10
40的二進制表示:
00101000
10的二進制表示:
00001010
學習參考: