代码之家  ›  专栏  ›  技术社区  ›  johny

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

  •  0
  • johny  · 技术社区  · 6 年前

    在输入时,我得到了多个 uint32_t 数字,实际上是长度为32的二进制字符串。我想生成二进制字符串(也称为另一个 uint32\u t 数字),其中第n位设置为 1 若输入的每个给定字符串中的第n位相同。


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

    输入 : 0011, 0101, 0110

    输出 : 1000

    因为 :输入时每个字符串的第一位都相同,输出中的前一位将设置为 1. 第二、第三和第四将设置为 0 因为他们有不同的价值观。


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

    uint32_t getResult( const vector< uint32_t > & data ){
        //todo
    }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   Martin Bonner supports Monica    6 年前

    您需要所有源位均为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
    }
    
        2
  •  2
  •   Some programmer dude    6 年前

    当然,首先需要在向量上循环。

    然后我们可以使用当前元素的XOR和 下一个 要素保存结果。

    对于下一次迭代,请执行相同的操作:将当前元素与下一个元素异或。然后按位或使用上一次迭代的保存结果。保存此结果。然后继续此操作,直到迭代了所有(负1)元素。

    保存的结果是所需结果的补充。


    以您的数字为例( 0011 ,则, 0101 0110 )然后我们的第一次迭代 0011 ^ 0101 这导致 0110 。我们的下一次迭代 0101 ^ 0110 这导致 0011 。按位或与上一个结果( 0110 | 0011 )给予 0111 。循环结束,按位补码给出结果 1000