二进制数列表:有多少个位置有一个和一个零

List of binary numbers: How many positions have a one and zero

我有一个整数列表,例如i=[1,7,3,1,5] 我首先将其转换为长度为 L 的相应二进制表示的列表,例如b=["001","111","011","001","101"]L=3.

现在我想计算在二进制表示中有多少个 L 位置有一个 1 以及一个零 0。在我的示例中,结果将是 return=2,因为在这些条目的第三个(最后一个)位置总是有一个 1。我很乐意发表任何评论。我认为,理想情况下我应该同时进行许多 Xor 运算。但是,我不确定如何才能有效地做到这一点。

编辑:感谢您的众多回答!!我得看看哪个最快。

您可以使用 python 个按位运算符来完成此任务。

def find(aList, nn):
    return sum( 
      filter( 
        lambda bb: bb > 0 ,
        (
          ( 1 <= (sum( (aa & 1<<kk) > 0 for aa in aList)) < len(aList) )
          for kk in range(nn)
        )
      )
    )

>>> find([1,7,3,1,5],3)
2
>>> find([],3)
0
>>> find([7],3)
0
>>> find([7,1],3)
2
>>> find([7,1,7],3)
2

这是一个解决方案,我怀疑它不是很有效,但很容易理解。

我遍历数字并找到唯一集,然后计算集长度为二的条目数:

# create a binary list of 3 elements from input list of integers
i=[1,7,3,1,5]
b=['{0:03b}'.format(x) for x in i]

# loop over the digit position (1,2,3)
cnt=[]
for pos in range(3):
    cnt.append(len(set([c[pos] for c in b])))

# cnt now contains a list of either 2(=both 1 and 0 present) or 1 (unique)
# so now we count the number of entries with "2"
result=cnt.count(2)
print (result)

答案:

2

首先,你的问题用 numpy 标记,但你的数组不是 numpy 数组。 这是一个使用 numpy 的解决方案:

import numpy as np

def has_zeroes_and_ones_at_index(arr, index_from_right):
    shifted_arr = np.right_shift(arr, index_from_right)
    has_one_at_index = shifted_arr % 2 == 1
    return(True in has_one_at_index and False in has_one_at_index)

arr = np.array([1, 7, 3, 1, 5])
res= has_zeroes_and_ones_at_index(arr, 1)
print(res)

因为数字是以二进制存储的,所以我们可以使用位移位将数字的所有位向右移动,然后查看最后一位。我们之前不必将它们转换为二进制格式。 5 (101) 右移一位 -> 2 (010)

然后我们创建一个掩码以查看哪些数字的最后一位为 1,return 当掩码中至少有一个真元素和一个假元素时为真。

一个观察结果是,如果您对所有数字进行 AND 运算,并对所有数字进行 OR 运算,那么这两个结果的 XOR 将为满足条件的 1。

所以:

from functools import reduce
from operator import and_, or_

def count_mixed_bits(lst):
    xor = reduce(and_, lst) ^ reduce(or_, lst)
    return bin(xor).count("1")


count_mixed_bits([1,7,3,1,5])  # 2

取而代之的是 numpy.binary_repr method that accepts length. Unfortunately, it can't handle arrays. But you can apply a functionality of np.unravel_index

def check(arr, lenght):
    positions = np.array(np.unravel_index(i, (2,)*lenght))
    return positions, np.sum(np.sum(positions, axis=1) != len(arr))

>>> positions, output = check(i, 3)
>>> print(positions)
>>> print(output)
[[0 1 0 0 1]
 [0 1 1 0 0]
 [1 1 1 1 1]]
2