首页 > Python3教程 > Python扩展程序库 -- NumPy

NumPy 位运算

程序中的所有数在计算机内存中都是以二进制的形式储存的。

位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。

如:6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。

NumPy "bitwise_" 开头的函数是位运算函数。

NumPy 位运算包括以下几个函数:

序号 操作及描述
1. bitwise_and 对数组元素执行位与操作
2. bitwise_or 对数组元素执行位或操作
3. invert 计算位非
4. left_shift 向左移动二进制表示的位
5. right_shift 向右移动二进制表示的位

bitwise_and

通过 np.bitwise_and() 函数对输入数组中的整数的二进制表示的相应位执行位与运算。

import numpy as np

# 13 17 的二进制形式
a, b = 13, 17
print(bin(a), bin(b)) # 0b1101 0b10001
print('\n')

# 13 17 的位与
print(np.bitwise_and(13, 17)) # 1

位与真值表

A B AND
1 1 1
1 0 0
0 1 0
0 0 0
    1 1 0 1
AND
  1 0 0 0 1
result 0 0 0 0 1

bitwise_or

通过 np.bitwise_or() 函数对输入数组中的整数的二进制表示的相应位执行位或运算。

import numpy as np

# 13 17 的二进制形式
a, b = 13, 17
print(bin(a), bin(b)) # 0b1101 0b10001
print('\n')

# 13 17 的位或
print(np.bitwise_or(13, 17)) # 29

位或真值表

A B OR
1 1 1
1 0 1
0 1 1
0 0 0
    1 1 0 1
OR
  1 0 0 0 1
result 1 1 1 0 1

invert

invert() 函数对数组中整数进行位取反运算,即 0 变成 1,1 变成 0。

对于有符号整数,取该二进制数的补码,然后 +1。二进制数,最高位为0表示正数,最高位为 1 表示负数。

如 ~1 的计算步骤:

  • 将1(这里叫:原码)转二进制 = 00000001
  • 按位取反 = 11111110
  • 发现符号位(即最高位)为1(表示负数),将除符号位之外的其他数字取反 = 10000001
  • 末位加1取其补码 = 10000010
  • 转换回十进制 = -2
import numpy as np

# 13 的位反转,其中 ndarray dtype uint8
print(np.invert(np.array([13], dtype=np.uint8))) # [242]

# 比较 13 242 的二进制表示,出现了位的反转
# 13 的二进制表示
print(np.binary_repr(13, width=8)) # 00001101

# 242 的二进制表示
print(np.binary_repr(242, width=8)) # 11110010

np.binary_repr()函数返回给定宽度中十进制数的二进制表示。

left_shift

numpy.left shift() 函数将数组元素的二进制表示中的位向左移动到指定位置,右侧附加相等数量的 0。

import numpy as np

print(' 10 左移两位:')
print(np.left_shift(10, 2))

print('10 的二进制表示:')
print(np.binary_repr(10, width=8))

print('40 的二进制表示:')
print(np.binary_repr(40, width=8))
# '00001010' 中的两位移动到了左边,并在右边添加了两个 0
# 10 左移两位:
# 40
#
# 10 的二进制表示:
# 00001010
#
# 40 的二进制表示:
# 00101000

right_shift

numpy.right_shift() 函数将数组元素的二进制表示中的位向右移动到指定位置,左侧附加相等数量的 0。

import numpy as np

print(' 40 右移两位:')
print(np.right_shift(40, 2))

print('40 的二进制表示:')
print(np.binary_repr(40, width=8))

print('10 的二进制表示:')
print(np.binary_repr(10, width=8))
# '00001010' 中的两位移动到了右边,并在左边添加了两个 0
# 40 右移两位:
# 10
#
# 40 的二进制表示:
# 00101000
#
# 10 的二进制表示:
# 00001010
关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。