是VAR | = 1<< 2;是否可逆?

时间:2012-03-08 21:38:11

标签: c++ algorithm math bit-manipulation

首先,我不确定这个按位操作发生了什么。 我编写代码并作为代码片段提供给其他方。

现在,如果VAR是无符号的8位整数(无符号字符),则r是0或1或2或4。 如果r的值已知且结果值存在,则可以跟随反转。 VAR | = 1<< r; //即200,其中VAR为192,r为3

例如 VAR的初始值为192 r的值为3 * 结果为200 *。

现在,如果我有200 ,而我知道r 的值为3,可以将其反转回192吗?

我希望这是最容易的,但我不知道这些按位操作,所以原谅我。

由于

5 个答案:

答案 0 :(得分:11)

答案是否定的。这是因为|(OR)运算符不是one-to-one function

换句话说,VAR有多个值可以产生相同的结果。

例如:

r = 3;
var0 = 8;
var1 = 0;

var0 |= 1 << r;  //  produces 8
var1 |= 1 << r;  //  produces 8

如果您尝试将其反转,则无法判断原始值是0还是8

类似的情况适用于& AND运算符。


从信息理论的角度来看:

运营商|&会导致 信息丢失 ,并且不会保留数据的熵。

另一方面,^(XOR),+-等运算符是一对一的,因此可以保留熵并且是可逆的。

答案 1 :(得分:6)

不,OR不可逆转。我相信只有XOR

例如,如果变量a包含1001 11001001 1000,则无论初始值是多少,您都将第三位(从右侧)设置为1 ,然后1001 11001001 1000作为源操作数将产生相同的值(1001 1100)。

答案 2 :(得分:1)

首先,1&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; 2&lt;

| =运算符是另一种写x = x |的方法ÿ;

最终结果是在x中设置第2位。如果x中的第2位为零,则反转它将清除第2位。如果第2位为1,那么它就是无操作。

你的问题是你提前知道第2位的初始状态是什么。

如果你的目标是清除第2位,你可以这样做:

x &= ~(1<<2);

答案 3 :(得分:0)

给定一个表达式result |= 1 << shiftAmount,对应于原始示例中的VAR和r,您可以使用以下内容执行完全相反的操作:

result &= ~(1 << shiftAmount)

请注意,这不是纯逆,因为按位或不是一对一的函数。按位或将一个或多个位设置为1,无论它们是否已经为0或1.我上面显示的表达式总是将相关位设置为0,所以如果该位为1,则最初它不会返回到原始状态。

答案 4 :(得分:0)

不,您无法撤消OR操作。

在你的例子中,当r = 3时,起始值VAR = 192和VAR = 200将导致200.

由于有两个输入值会产生相同的结果,因此您不知道要返回哪一个。