我一直在绞尽脑汁想出一个解决方案,但被困住了。
我有一个函数,该函数接受输入(0b0
,0b1
或0b10
)并设置某些变量的位-至少应该如此。
它更改的值具有两种状态:0b100
或0b101
。我想从输入中设置各个位。对于真正的位,这很容易,但是对于错误的位,则比较棘手。适用于所有方案的一些伪代码:
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 = 0b10
与0b101
的第二位0b00
相比,因为0b10
的最左位是第二位。在极少数情况下,不变的位可能会更改:P(虽然不是我的意思),所以
0b001
或0b000
可能就是它的值。因此,我无法创建动态蒙版并仅比较自己的位。解决问题的最佳方法是回答该替代问题。伙计们,非常感谢您的帮助! 最佳答案
步骤1:屏蔽掉低两位。
var &= 0b100;
步骤2:通过“或”运算分配低两位。
var |= input;
请注意,您可能需要根据实际数据类型在实际代码中的步骤1中更改位掩码。