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
}
当然,首先你需要遍历向量。
然后我们可以对当前元素和下一个元素进行异或运算。保存结果。
对于下一次迭代,执行相同的操作:当前元素与下一个元素的异或。但是然后与上一次迭代的保存结果按位或。保存这个结果。然后继续此操作,直到遍历所有(减去一个)元素。
保存的结果就是你想要的结果的补码。
使用您的示例数字(0011
、0101
和 0110
),然后我们得到 0011 ^ 0101
的第一个迭代结果是 0110
。下一次迭代我们有 0101 ^ 0110
,结果是 0011
。与之前的结果 (0110 | 0011
) 按位或运算得出 0111
。循环结束,按位补码给出结果 1000
.
输入时我得到多个 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
}
当然,首先你需要遍历向量。
然后我们可以对当前元素和下一个元素进行异或运算。保存结果。
对于下一次迭代,执行相同的操作:当前元素与下一个元素的异或。但是然后与上一次迭代的保存结果按位或。保存这个结果。然后继续此操作,直到遍历所有(减去一个)元素。
保存的结果就是你想要的结果的补码。
使用您的示例数字(0011
、0101
和 0110
),然后我们得到 0011 ^ 0101
的第一个迭代结果是 0110
。下一次迭代我们有 0101 ^ 0110
,结果是 0011
。与之前的结果 (0110 | 0011
) 按位或运算得出 0111
。循环结束,按位补码给出结果 1000
.