仅使用逐位运算的高效方法

时间:2014-08-02 06:14:28

标签: performance algorithm bit-manipulation

我们获得n个二进制数,每个k位。我们需要找到一个k位二进制数,只有当i位被设置在i给定的二进制数中时,才会设置n位。例如,

0010
0011
0100
1110

应该给1001作为答案。你只需要使用逐位操作来实现这一点。这是我的解决方案:

unsigned int array[n];//we have our 'n' numbers here
unsigned int answer=0,rxor=0,t1,t2;
for(int i=0; i<n; ++i)
{
     t1 = answer;
     answer ^= array[i];
     t2 = (~t1) & answer;
     answer &= ~(t2 & rxor);
     rxor |= array[i];
}

最终答案将存储在answer变量中。它每次迭代使用总共7个按位操作(1 xor,1 or,2 negation,3 and),总计7*n次操作。我的问题是,可以进一步减少操作次数。

1 个答案:

答案 0 :(得分:10)

要获得最终答案,您需要知道哪些位至少使用过一次,哪些位至少使用过两次。可以非常快速地计算这两个条件:

unsigned usedOnce = 0;
unsigned usedTwice = 0;
for(int i = 0; i < n; i++) {
    usedTwice |= usedOnce & array[i];
    usedOnce |= array[i];
}
unsigned answer = usedOnce & ~usedTwice;

这只是循环中的三个操作。