C ++ - 给定多个二进制字符串,如果在所有给定的字符串中第n位相同,则产生二进制字符串,其中第n位被设置

时间:2018-03-11 13:39:51

标签: c++ bit-manipulation bitwise-operators uint32

在输入时,我被赋予多个uint32_t个数字,实际上是长度为32的二进制字符串。我想生成二进制字符串(又名另一个uint32_t数字),其中第n位设置为1如果输入的每个给定字符串中的第n位相同。

以下是4位字符串的简单示例(只是更简单的同一问题的实例):

输入0011, 0101, 0110

输出1000

因为:输入中的每个字符串中的第一位相同,因此输出中的第一位将设置为1,第二,第三和第四位将设置为{{1}因为它们有不同的值。

从给定输入产生输出的最佳方法是什么?我知道我需要使用按位运算符,但我不知道它们中的哪一个以及它们的顺序。

0

2 个答案:

答案 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与前一次迭代的保存结果。保存此结果。然后继续这个,直到你遍历所有(减去一个)元素。

保存的结果是您想要的补充。

获取您的示例数字(001101010110),然后我们0011 ^ 0101的第一次迭代产生0110。下一次迭代我们得到0101 ^ 0110,结果为0011。与先前结果(0110 | 0011)的按位OR给出0111。循环结束和按位补码给出结果1000