我一直在绞尽脑汁想出一个解决方案,但被困住了。
我有一个函数,该函数接受输入(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:屏蔽掉低两位。

var &= 0b100;

步骤2:通过“或”运算分配低两位。
var |= input;

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

10-07 23:13