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

C++ - Given multiple binary strings, produce binary string where n-th bit is set if in all given strings is n-th bit same

输入时我得到多个 uint32_t 数字,它们实际上是长度为 32 的二进制字符串。我想生成二进制字符串(a.k.a。另一个 uint32_t 数字),其中如果来自输入的每个给定字符串中的第 n 位相同,则第 n 位设置为 1


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

输入0011, 0101, 0110

输出1000

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


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

uint32_t getResult( const vector< uint32_t > & data ){
    //todo
}

您想要所有源位都为 1 的位和所有源位都为 0 的位。只需对源值和源值的非进行与运算,然后对结果进行或运算。

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
}

当然,首先你需要遍历向量。

然后我们可以对当前元素和下一个元素进行异或运算。保存结果。

对于下一次迭代,执行相同的操作:当前元素与下一个元素的异或。但是然后与上一次迭代的保存结果按位或。保存这个结果。然后继续此操作,直到遍历所有(减去一个)元素。

保存的结果就是你想要的结果的补码。


使用您的示例数字(001101010110),然后我们得到 0011 ^ 0101 的第一个迭代结果是 0110。下一次迭代我们有 0101 ^ 0110,结果是 0011。与之前的结果 (0110 | 0011) 按位或运算得出 0111。循环结束,按位补码给出结果 1000.