在输入时,我被赋予多个uint32_t
个数字,实际上是长度为32的二进制字符串。我想生成二进制字符串(又名另一个uint32_t
数字),其中第n位设置为1
如果输入的每个给定字符串中的第n位相同。
以下是4位字符串的简单示例(只是更简单的同一问题的实例):
输入:0011, 0101, 0110
输出:1000
因为:输入中的每个字符串中的第一位相同,因此输出中的第一位将设置为1
,第二,第三和第四位将设置为{{1}因为它们有不同的值。
从给定输入产生输出的最佳方法是什么?我知道我需要使用按位运算符,但我不知道它们中的哪一个以及它们的顺序。
0
答案 0 :(得分:3)
你想要所有源位为1的位和所有源位为0的位。只需和源值和源值的NOT,然后是OR结果。
uint32_t getResult( const vector< uint32_t > & data ){
uint32_t bitsSet = ~0;
uint32_t bitsClear = ~0;
for (uint32_t d : data) {
bitsSet &= d;
bitsClear &= ~d;
}
return bitsSet | bitsClear
}
答案 1 :(得分:2)
首先,你需要循环遍历矢量。
然后我们可以使用当前元素的XOR和 next 元素。保存结果。
对于下一次迭代,执行相同的操作:当前元素与下一个元素的XOR。但然后按位OR与前一次迭代的保存结果。保存此结果。然后继续这个,直到你遍历所有(减去一个)元素。
保存的结果是您想要的补充。
获取您的示例数字(0011
,0101
和0110
),然后我们0011 ^ 0101
的第一次迭代产生0110
。下一次迭代我们得到0101 ^ 0110
,结果为0011
。与先前结果(0110 | 0011
)的按位OR给出0111
。循环结束和按位补码给出结果1000
。