首先,我不确定这个按位操作发生了什么。 我编写代码并作为代码片段提供给其他方。
现在,如果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吗?
我希望这是最容易的,但我不知道这些按位操作,所以原谅我。
由于
答案 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 1100
或1001 1000
,则无论初始值是多少,您都将第三位(从右侧)设置为1
,然后1001 1100
和1001 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.
由于有两个输入值会产生相同的结果,因此您不知道要返回哪一个。