仅使用按位运算的有效方法

Posted

技术标签:

【中文标题】仅使用按位运算的有效方法【英文标题】:Efficient method using only bit-wise operations 【发布时间】:2014-08-02 06:14:27 【问题描述】:

我们得到n 二进制数,每个k 位。我们需要找到一个k 位二进制数,其中ith 位仅在ith 位设置为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】:

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

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

unsigned answer = usedOnce & ~usedTwice;

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

【讨论】:

以上是关于仅使用按位运算的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

用于减少内存的 Java 整数标志和按位运算

尝试在使用按位运算符保持模块性的同时压缩代码

开发人员应该了解哪些有用的按位运算符代码技巧? [关闭]

有人知道C语言中&和^的使用方法吗?

按位运算符PHP

使用按位运算进行基数排序