是否可以使用位运算符检查数字是否在数组中

时间:2015-04-11 13:03:11

标签: c arrays bit-manipulation

也许这是无稽之谈。我已经考虑了很多,我想知道是否有可能以某种方式实现这样的事情:添加数组的所有元素并使用结果对位掩码来识别哪些是数字在数组中。事实是,我不知道如何做到这一点,但它或多或少会因此而存在。

这是否可能?

2 个答案:

答案 0 :(得分:0)

好的,如果添加数字,则无法识别数组中是否有某个特殊数字。例如,假设你有数组

int a[2]={2,4};

总和是6,但是6可以来自1 + 5,所以你用总和来丢失信息。如果您的目标是快速找到数组中的数字,我建议使用binary_search。作为参考,举例来说,请参阅http://www.cplusplus.com/reference/algorithm/binary_search/ 这是c ++,而不是c,但你可以找到c的兼容实现,比如 http://www.programmingsimplified.com/c/source-code/c-program-binary-search

答案 1 :(得分:0)

只有当数组的所有元素都是2的精确幂时,才能执行此操作。在这种情况下,可以使用元素的并集替换数组,并且可以通过检查数字是否为幂2以及它的唯一位是否存在于数组中来检查数字是否在数组中:

int sum = 0;
int array[] = { 1, 4, 8, 256, ... };
...
for (size_t i = 0; i < sizeof array/sizeof *array; i++) {
    sum |= array[i];
}
...
int n = get_value_for_n();

if ((n & (n - 1)) == 0 && (sum & n) != 0) {
    // n is a power of 2 present in sum
}

如果n0,则2的权力测试可能会出现误报,但sum & n仍为0

在大多数其他情况下,您需要遍历数组。如果此数组很大,您可以对其进行排序并使用二进制搜索来查找其中的数字。