反转按位左移和OR分配

n.r*_*.r. 7 c c++ bit-manipulation bit-shift or-operator

对此有什么反函数?

A = (B << 3) | 0x07;
Run Code Online (Sandbox Code Playgroud)

B当我已经有相应的时候,我怎么能得到一个A

Jam*_*rey 16

你无法完全恢复所有位.

B << 3将'B'向左移动三位,并且它不会循环.这意味着B的前三位的状态被删除 - 除非你知道那些,否则你将无法恢复B.

例:

10101101 << 3

Turns: 10101101
          ^---^
Into:  01101000
       ^---^
Run Code Online (Sandbox Code Playgroud)

前三位丢失,底三位填充零.已删除的数据已删除.

| 0x07填充底部的三个位(带111),所以即使你没有转移,你会消除与最低三个位111,使得这些位是无法挽救的.

现在,如果它是XOR而不是OR'd,它可以通过另一个XOR恢复:

A ^ same-value 可以与另一个人解开A ^ same-value因为((A ^ B) ^ B) == A

A | same-value 不能与另一个人取消A | same-value

A | same-value也不能用 AND取消:A & same-value

但是这种转变仍然会引起问题,即使它是异或(它不是).

  • 正确,你失去了前三位.即使将初始函数更改为左旋转,您仍将丢失信息,因为`| 无论如何,0x07`正在设置最右边的三位. (2认同)