- 假设我们现在有一个整型数字 a , 那么我们想要计算其中拥有1 的位数的数量, 那么最基础的想法就是将其看做一个二进制串
- 假设我们需要计算的32位整型数字是 26 , 那么其二进制串为 11010, 这里我们省略了前导的27个 0.
- 我们可以依次将当前二进制串的每一个与 1 按位与, 如果是结果为1, 那么计数就加 1.
def count_1s_basically(x):
count = 0
while x > 0:
if x & 1:
count += 1
x >>= 1
return count
def count_1s_enhanced(x):
count = 0
while x > 0:
count += 1
x = x & (x - 1)
return count
def count_1s_simultaneously(x):
count = 0
operators = [0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff]
blocks = [x & operator for operator in operators] # 列表推导
for block in blocks:
count += count_1s_enhanced(block)
return count
# 显然我们可以将这个结论推广到任意以 8 为倍数的比特块中.
# 例如从对于16位数字, 我们就可以将数字 x 与 0x0101做位与
val = 0
# x 为这个 8 比特数
for index in range(8):
val += x & 0x01
x >>= 1
# 直观上看就是将前面的 8 位数字与后面 8 位数字对齐, 然后进行加法. 显然这时候我们就得到了这个16位数字的 1 的计数
val += val >> 8
def count_1s_simultaneously_enhanced(x):
val = 0
for index in range(8):
val += x & 0x0101010101010101
x >>= 1
val += val >> 32
val += val >> 16
val += val >> 8
return val & 0xff