我们获得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
次操作。我的问题是,可以进一步减少操作次数。
答案 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;
这只是循环中的三个操作。