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)
如果您试图反转它,您将无法判断原始值是否为0或8.
类似的情况适用于&AND运算符.
从信息理论的角度来看:
操作员|并&导致信息丢失,并且不保留数据的熵.
在另一方面,运营商,如^(XOR),+和-是一到一个,因此保护熵和是可逆的.
不,OR不可逆转.我相信只是XOR.
例如,如果变量a包含1001 1100或1001 1000,并且您将第三个位(从右侧)设置为1无论初始值是什么,那么两个1001 1100和1001 1000作为源操作数将导致相同的值(1001 1100).