反转按位运算符左移
Reversing Bitwise Operator Left Shift
更新!!!
我正在尝试反转按位左移。我有代码:
int n1;
int n2;
int n3;
n1 = n1 + 128;
n2 = n2 + 128;
n3 = n3 + 128;
int size = n1 + ((n3 << 8) + n2 << 8); // size = 9999
我怎样才能返回 n1,n2,n3
给定结果 9999?
这叫做位移。它将位(在二进制级别)向右移动 8。
128 << 8 = 32768
假设你有 16, 二进制的 10000 将它左移 2; 16 << 2 = 64(1000000 二进制)
这对于加密、数据压缩甚至处理像颜色值这样简单的事情都很常见(当您想要将一种颜色的单独 RGB 分量表示为单个整数时)
在您的示例中,听起来多个值组合成一个整数以在发送数据包时节省 space。位移位是一种从较大数字中提取单个值的方法。但这只是一个猜测。
有时在 Java 中使用 128 的偏移来解决 byte
被签名的问题。添加 128 可确保结果(将是 int
)再次为非负数。只要和encoder是对称的(对应writeMessage
),那么就是一种对unsigned bytes进行编码的方式
在那之后,字节被重新组合成更大的东西。这不适用于带符号的字节。顺便说一下,我认为缺少一对括号,表达式应该是n1 + ((n3 << 8) + n2 << 8)
,或者更清楚:n1 + (n2 << 8) + (n3 << 16)
另一种方法是使用 byteValue & 0xFF
去除由符号扩展添加的前导字符。这样做的好处是原始字节“按其自身”使用,没有奇怪的偏移量。
逆运算是提取字节并再次将它们偏移 128(加或减 128 实际上会做同样的事情,但为了对称性,在这里减去更有意义),例如:
byte n1 = (byte)((size & 0xFF) - 128);
byte n2 = (byte)((size >> 8 & 0xFF) - 128);
byte n3 = (byte)((size >> 16 & 0xFF) - 128);
& 0xFF
操作不是绝对必要的(最终转换为 byte
去掉了高位),但清楚地表明正在提取字节。
更新!!! 我正在尝试反转按位左移。我有代码:
int n1;
int n2;
int n3;
n1 = n1 + 128;
n2 = n2 + 128;
n3 = n3 + 128;
int size = n1 + ((n3 << 8) + n2 << 8); // size = 9999
我怎样才能返回 n1,n2,n3
给定结果 9999?
这叫做位移。它将位(在二进制级别)向右移动 8。
128 << 8 = 32768
假设你有 16, 二进制的 10000 将它左移 2; 16 << 2 = 64(1000000 二进制)
这对于加密、数据压缩甚至处理像颜色值这样简单的事情都很常见(当您想要将一种颜色的单独 RGB 分量表示为单个整数时)
在您的示例中,听起来多个值组合成一个整数以在发送数据包时节省 space。位移位是一种从较大数字中提取单个值的方法。但这只是一个猜测。
有时在 Java 中使用 128 的偏移来解决 byte
被签名的问题。添加 128 可确保结果(将是 int
)再次为非负数。只要和encoder是对称的(对应writeMessage
),那么就是一种对unsigned bytes进行编码的方式
在那之后,字节被重新组合成更大的东西。这不适用于带符号的字节。顺便说一下,我认为缺少一对括号,表达式应该是n1 + ((n3 << 8) + n2 << 8)
,或者更清楚:n1 + (n2 << 8) + (n3 << 16)
另一种方法是使用 byteValue & 0xFF
去除由符号扩展添加的前导字符。这样做的好处是原始字节“按其自身”使用,没有奇怪的偏移量。
逆运算是提取字节并再次将它们偏移 128(加或减 128 实际上会做同样的事情,但为了对称性,在这里减去更有意义),例如:
byte n1 = (byte)((size & 0xFF) - 128);
byte n2 = (byte)((size >> 8 & 0xFF) - 128);
byte n3 = (byte)((size >> 16 & 0xFF) - 128);
& 0xFF
操作不是绝对必要的(最终转换为 byte
去掉了高位),但清楚地表明正在提取字节。