我一直绞尽脑汁试图想出一个解决方案,但我被卡住了。
我有一个函数,这个函数接受输入(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
可能是它的值。出于这个原因,我不能创建一个动态掩码,只比较我的位...解决我的问题的最好方法是回答这个替代问题。非常感谢你的帮助,伙计们!
答案 0 :(得分:2)
步骤1:屏蔽低两位。
201103L
步骤2:通过OR运算分配低两位。
var &= 0b100;
请注意,您可能需要在实际代码中根据实际数据类型更改步骤1中的位掩码。