【发布时间】:2013-03-07 07:46:18
【问题描述】:
将 2 位或更少的更改定义为 32 位整数被认为是“有效的”。
为简化起见,让我们以 4 位二进制为例。
0000 -> 1000 有效
0000 -> 1100 有效
0000 -> 1001 有效
0000 -> 1101 无效
所以实际上这意味着有 C(32, 2) * 2^2 种可能的组合
我想知道如何编写像vector<int> foo(int numberToBeChanged, int n) 这样的函数,它接受一个数字n(允许的位更改数)并返回所有可能组合的集合?谢谢。
【问题讨论】:
-
您真的需要可能的更改列表(我想是从 0x00000000 开始)还是检查给定数字是否是允许更改的函数(从 0x00000000 开始)?
-
如果您只需要一个函数来计算 Hamming distance of two binary strings 并且您使用的是现代 X86 处理器,您可能需要查看 POPCNT 指令(与 xor 结合)
-
关于可能组合的数量,实际上它不是您所指出的 C(32, 2) * 4 ,因为您也计算了重复项。组合的实数为 1 + 32 + C(32, 2),3 部分中的每一个分别表示无变化、1 位变化和 2 位变化的组合。
-
@AndreHolzner 一个列表,检查相当容易
标签: algorithm bit-manipulation