我有以下问题。我有一个用二进制表示的数字。我需要一种方法来随机选择其中两个不同的位(即找到1和0)。除此之外,我还对该数字执行其他操作(反转序列,置换序列等),这些是我已经使用的方法:

  • 跟踪所有的1和0。当我创建二进制数的二进制表示形式时,我会存储0和1的位置。这样我就可以为一个列表选择一个索引,为另一个列表选择一个索引。然后,我有两个不同的位。为了运行其他操作,我从基本交换操作创建了这些操作,这些操作在操作时会更新1和0的索引。因此,我有第三个列表,存储每个位的列表索引。如果某位为1,则我知道在列表中的所有索引都为1(对于零也一样)。
  • 完成不需要位不同的操作时,上述方法会产生一些开销。因此,另一种方法是在需要不同位时创建列表。

  • 有谁有更好的主意吗?我需要这些操作非常快(我正在使用popcount,clz和其他二进制操作)

    最佳答案

    我觉得我没有足够的信息来正确评估折衷,但是也许您会发现这个想法有用。要在一个单词中找到一个随机的1(通过popcount和容器采样在多个单词中找到1;通过补码找到0),首先测试popcount。如果弹出计数很高,则随机地均匀生成索引并对其进行测试,直到找到一个为止。如果popcount为中等,则采用统一的随机掩码进行按位AND(如果AND为零,则保留原始值)以减少popcount。当popcount低时,使用clz有效地编译(小)候选列表,然后随机地均匀采样。

    08-25 08:16