【问题标题】:is VAR |= 1 << 2; reverisble?是 VAR |= 1 << 2;可逆?
【发布时间】:2012-03-26 09:21:28
【问题描述】:

首先我不确定这个按位运算发生了什么。 我编写代码并作为代码 sn-ps 提供给其他方。

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

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

现在如果我有这个 200,并且我知道 r 的值是 3,我可以把它倒回 192 吗?

我希望是最简单的,但我不知道这些按位运算,请见谅。

谢谢

【问题讨论】:

  • 没有。从0 | 11 | 1 可以产生一个位值1。
  • 有道理,甚至 VAR
  • @Jasonz 没错。因为您不知道已移出的位。只要多个输入可以产生相同的输出,则该函数是不可逆的。

标签: c++ algorithm math bit-manipulation


【解决方案1】:

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

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

例如:

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

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

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

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


从信息论的角度来看:

运算符|&amp; 会导致信息丢失,并且不会保留数据的熵。

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

【讨论】:

  • 一对一的函数参考描绘了一幅相当不错的画面。
  • 视情况而定,这可能是真的。有符号整数溢出是未定义的行为。但是如果我们假设无符号整数,那么即使溢出,+- 也可以反转。例如:0xffffffff + 1 = 0 反相为0 - 1 = 0xffffffff
【解决方案2】:

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

例如,如果变量a 包含1001 11001001 1000,并且无论初始值是什么,都将第三位(从右起)设置为1,那么1001 1100 和@ 987654328@ 作为源操作数将产生相同的值 (1001 1100)。

【讨论】:

    【解决方案3】:

    首先,1

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

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

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

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

    x &= ~(1<<2);
    

    【讨论】:

      【解决方案4】:

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

      result &= ~(1 << shiftAmount)
      

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

      【讨论】:

        【解决方案5】:

        不,您不能反转 OR 操作。

        在您的示例中,当 r=3 时,起始值 VAR=192 和 VAR=200 将导致 200。

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

        【讨论】:

          猜你喜欢
          • 2013-04-12
          • 2016-02-05
          • 2019-03-30
          • 1970-01-01
          • 2018-08-02
          • 2019-10-01
          • 2017-02-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多