是VAR | = 1 << 2; reverisble?

Jas*_*n z 2 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吗?

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

谢谢

Mys*_*ial 11

答案是不.这是因为|(OR)运算符不是一对一的函数.

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

例如:

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

var0 |= 1 << r;  //  produces 8
var1 |= 1 << r;  //  produces 8
Run Code Online (Sandbox Code Playgroud)

如果您试图反转它,您将无法判断原始值是否为08.

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


从信息理论的角度来看:

操作员|&导致信息丢失,并且不保留数据的熵.

在另一方面,运营商,如^(XOR),+-是一到一个,因此保护熵和是可逆的.


Mat*_*hew 6

不,OR不可逆转.我相信只是XOR.

例如,如果变量a包含1001 11001001 1000,并且您将第三个位(从右侧)设置为1无论初始值是什么,那么两个1001 11001001 1000作为源操作数将导致相同的值(1001 1100).