是 VAR |= 1 << 2;尊敬?
is VAR |= 1 << 2; reverisble?
首先,我不确定这个按位操作中发生了什么。我编写代码并将其作为代码片段提供给其他方。
现在,如果VAR是无符号的8位整数(无符号字符),并且r是0或1或2或4。如果r的值是已知的,并且结果值在那里,则可以反转以下内容。VAR|=1<lt;r//这是200,其中VAR为192,r为3
例如,VAR的初始值为192,r的值为3*结果为200*。
现在,如果我有这个200,并且我知道r的值是3,可以将它反转回192吗
我希望这是最简单的一个,但我不知道这些比特操作,所以请原谅我
感谢
|
(OR)运算符不是一对一函数。
换句话说,VAR
的多个值可以产生相同的结果。
例如:
r = 3;
var0 = 8;
var1 = 0;
var0 |= 1 << r; // produces 8
var1 |= 1 << r; // produces 8
如果您试图反转它,您将无法判断原始值是0
还是8
。
类似的情况也适用于&
AND运算符。
从信息论的角度来看:
算子|
和&
引起信息丢失并且不保持数据的熵。
另一方面,诸如^
(XOR)、+
和-
的运算符是一对一的,因此保持熵并且是可逆的。
否,OR
不可反转。我相信只有XOR
是
例如,如果变量a
包含1001 1100
或1001 1000
,并且不管初始值是什么,都将第三位(从右起)设置为1
,则作为源操作数的1001 1100
和1001 1000
将产生相同的值(1001 1100
)。
首先,1<lt;2只是用二进制写"4"或100的另一种方式。
|=运算符是书写x=x|y的另一种方式;
最终结果是在x中设置位2。如果x中的位2为零,则反转为清除位2。如果比特2是1,那么它就是no-op。
你的问题是,你不知道比特2的初始状态是什么。
如果你的目标是清除第2位,你可以这样做:
x &= ~(1<<2);
给定一个表达式result |= 1 << shiftAmount
,对应于原始示例中的VAR和r,您可以使用以下方法来执行完全相反的操作:
result &= ~(1 << shiftAmount)
请注意,这不是一个纯逆,因为按位或不是一个一对一的函数。逐位或将一个或多个位设置为1,无论它们是否已经是0或1。我上面显示的表达式将始终将相关的位设置为0,因此如果该位最初为1,它将不会返回到其原始状态。
不,不能反转OR运算。
在您的示例中,当r=3时,起始值VAR=192和VAR=200都将产生200。
由于有两个输入值将给出相同的结果,您将不知道返回哪一个。
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 没有匹配的“运营商&lt;&lt;”