【问题标题】:C++ - Given multiple binary strings, produce binary string where n-th bit is set if in all given strings is n-th bit sameC++ - 给定多个二进制字符串,如果所有给定字符串的第 n 位相同,则生成其中设置第 n 位的二进制字符串
【发布时间】:2018-03-11 13:39:51
【问题描述】:

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


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

输入0011, 0101, 0110

输出1000

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


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

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

【问题讨论】:

  • 请记住,二进制数在写入时与其他任何数字一样,第一个数字是最右边的位。所以在你的例子中, last 数字(和最后一位)是一样的。
  • @Christophe 到目前为止,我只是想了解按位运算符,并在纸上勾勒出一些想法。我正在考虑使用^ XOR 运算符并以某种方式将它与 C++ 中的 for-each 构造一起使用,但我不知道如何进行
  • @Someprogrammerdude 我有点迷失在这个 LSB 和 MSB 的东西上。写下 32 位数字时,LSB 在右边,MSB 在左边,我知道。我原来的帖子有点混乱,我明白
  • @Someprogrammerdude 我怀疑它会起作用。相反……好吧,我不会给 OP 太多提示。
  • @Someprogrammerdude 0011 ^ 0101 是 0110 然后 0110 ^ 0110 是 0000。也许引入一个不看事物相似之处和不同之处。但也许您需要处理的不仅仅是一个累积变量

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


【解决方案1】:

您需要所有源位为 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
}

【讨论】:

  • 就像 OP 问题/需求的措辞一样,我认为这可能是一项家庭作业。不错的答案。
  • @JustinRandall 它是蛮力算法优化的一部分,用于计算多个数字的编辑距离(其中固定位不会改变解决方案)。在做作业时寻求帮助有什么问题吗?我没有寻求解决方案,而是寻求按位运算符的建议和帮助。
【解决方案2】:

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

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

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

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


以您的示例编号(001101010110)然后我们有 0011 ^ 0101 的第一次迭代,结果为 0110。下一次迭代我们有0101 ^ 0110,结果是0011。与前面的结果 (0110 | 0011) 进行按位或运算得到 0111。循环结束,按位补码得到结果1000

【讨论】:

  • 要看到这是正确的,如果一个位与其后继位不同,则 XOR 将为 1。如果任何值与其后继值不同,则累积的 OR 将为 1。非常整洁。
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 2017-01-02
  • 2015-08-22
  • 1970-01-01
相关资源
最近更新 更多