按位运算符和位操作(没有解决方案?)

时间:2017-12-13 07:04:06

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

我一直绞尽脑汁试图想出一个解决方案,但我被卡住了。

我有一个函数,这个函数接受输入(0b00b10b10)并设置某个变量的位 - 或者至少它是应该。

它更改的值有两种状态:0b1000b101。我想从输入中设置相应的位。这对于真正的比特来说很容易,但对于假比特来说却很棘手。所有场景的一些伪代码:

if (var == 0b100 && input == 0b0) { do nothing }   // bit already set
if (var == 0b101 && input == 0b0) { var = 0b100 }  // bit is different, so we set it.

if (var == 0b100 && input == 0b1) { var = 0b101 }  // bit is different, so we set it.
if (var == 0b101 && input == 0b1) { do nothing }   // bit is already set

if (var == 0b100 && input == 0b10) { var = 0b110 } // bit is never set, so set it
if (var == 0b101 && input == 0b10) { var = 0b110 } // bit is never set, so set it

我不想欺骗并为每种可能性单独声明,我想要一个功能。这就是我串起来的东西,但它显然不起作用:

if ( var ^ input )
{
    var ^= input;
}

此代码的问题是第3位(最左边的一位)始终为真。

这甚至可能吗?

修改

这是同样的问题,只是提出了一种不同的方式(这将产生不同的答案)。

一个函数接受一位输入。我想取最左边的位并将该位与只有那位比较另一个变量。例如input = 0b100b101的第二位0b00进行了比较,因为0b10的最左位是第二位。

在极少数情况下,不变的位可能会改变:P(不是来自我),因此0b0010b000可能是它的值。出于这个原因,我不能创建一个动态掩码,只比较我的位...解决我的问题的最好方法是回答这个替代问题。非常感谢你的帮助,伙计们!

1 个答案:

答案 0 :(得分:2)

步骤1:屏蔽低两位。

201103L

步骤2:通过OR运算分配低两位。

var &= 0b100;

请注意,您可能需要在实际代码中根据实际数据类型更改步骤1中的位掩码。