2012-03-08 93 views
2

首先我不确定在这个按位操作中发生了什么。 我得到的代码被写入并作为代码片段提供给其他方。是VAR | = 1 << 2; reverisble?

现在如果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

号可能已经无论从'0产生的比特值1 | 1'或'1 | 1'。 – Peteris 2012-03-08 21:40:16

+0

有意义,甚至VAR << = 3;不能逆转?我不知道我在问什么,但它是问题的一部分。 – 2012-03-08 21:46:18

+1

@Jasonz这是正确的。因为你不知道已经移位的位。无论何时多个输入都能产生相同的输出,那么该函数是不可逆的。 – Mysticial 2012-03-08 21:47:25

回答

11

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

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

例如:

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

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

如果你想反其道而行,你将无法告诉原来的值是否为08

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


从信息理论的观点:

运营商|&招致的信息一个损失和不保留数据的熵。另一方面,^(XOR),+-等运营商是一对一的,因此保留了熵并且是可逆的。

+1

这个一对一的函数引用描绘了一幅相当不错的图片。 – chris 2012-03-08 22:30:20

+0

禁止溢出。 – Hello71 2012-03-09 04:16:11

+1

视情况而定,这可能是事实。有符号的整数溢出是未定义的行为。但是如果我们假设无符号整数,那么即使溢出,“+”和“ - ”也可能被反转。例如:'0xffffffff + 1 = 0'反转是'0 - 1 = 0xffffffff'。 – Mysticial 2012-03-09 04:20:01

6

没有,OR是不可逆式。我相信只有XOR是。

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

0

给出的表达式result |= 1 << shiftAmount,对应于VAR和r在你原来的例子,你可以用下面的做完全相反:

result &= ~(1 << shiftAmount) 

注意,这不是一个单纯的逆,因为按位或不是一对一的功能。按位或将一个或多个位设置为1,无论它们是否已为0或1.上面显示的表达式将始终将相关位设置为0,因此如果该位最初为1,则不会返回到其位原始状态。

0

不,你不能扭转OR操作。

在你的榜样,与R = 3,无论是初始值VAR = 192和VAR = 200将导致200

既然有这将产生相同的结果两个输入值,你不会知道要回到哪一个。

1

首先,1 < < 2是写入“4”或100以二进制形式的另一种方式。

| =运算符是另一种写x = x | Ÿ;

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

问题与您的问题是,你不知道什么是第2位的初始状态。

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

x &= ~(1<<2); 
相关问题