也许这听起来有些无聊。我思考了很多,想知道是否可能实现类似的功能:将数组的所有元素相加,并使用结果与位掩码进行比较,以确定哪些数字在数组中。事实上,我不知道如何做到这一点,但应该差不多是这样的。
这种方法可行吗?
这种方法可行吗?
只有当数组的所有元素都是精确的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
}
好的,如果你把这些数字加起来,你就无法确定数组中是否有某个特殊的数字。例如,想象一下你有一个数组:
int a[2]={2,4};
总和为6,但6可以由1+5得到,因此您在总和中丢失了信息。如果您的目标是快速在数组中查找数字,则建议使用二分查找。有关示例,请参见http://www.cplusplus.com/reference/algorithm/binary_search/。这是c++,而不是c,但您可以找到适用于c的兼容实现,例如http://www.programmingsimplified.com/c/source-code/c-program-binary-search。