2

我正在研究何时想要/应该使用位移运算符。我知道我们不需要使用它们来乘以 2 等,因为 JIT 编译会处理这个问题。我遇到了为什么我们需要在 java 中使用移位运算符,并且对部分接受的答案感到困惑:

For example, say I have two bytes that are the high-order and low-order bytes
of a two-byte (16-bit) unsigned value. Say you need to construct that value. 
In Java, that's:

int high = ...;
int low = ...;
int twoByteValue = (high << 8) | low;

You couldn't otherwise do this without a shift operator.

To answer your questions: you use them where you need to use them! and nowhere else.

我知道我遗漏了一些东西,因为在我看来,他只是将高乘以 2^8 并将其加到低(我以前从未真正见过|在这种情况下使用过,但是当我插入虚拟值并运行时我的代码,看起来只是将两者加在一起)。这里到底发生了什么?

编辑:作为参考,我有high = 10and low = 3

4

1 回答 1

3

例如,让我们组合数字 54321 的 16 位表示:1101 0100 0011 0001从其高位 8 位和低位 8 位。

高 8 位为:1101 0100 低 8 位为:0011 0001

1101 0100 << 8

会产生

1101 0100 0000 0000

然后,我们将 this ( |) 与低位进行按位或

1101 0100 0000 0000
          0011 0001
-------------------
1101 0100 0011 0001

我们现在在 54321 上有完整的二进制表示(当然假设我使用的是无符号整数)


编辑:使用你的例子:high=10low=3

high,以 8 位写出,将是0000 1010

low,以相同的方式编写,将是0000 0011

如果我们向左移 8 位:

0000 1010 0000 0000

如果我们或反对低:

0000 1010 0000 0000
          0000 0011
-------------------
0000 1010 0000 0011

如果我们将此模式视为十进制整数,则意味着 2563

也许令人困惑的部分是10and3独立在这种情况下根本没有任何意义。两者的组合在这里有价值。

也许您正在逐字节读取文件,但在文件的一部分中有一个 16 位整数序列。您必须获取每一对字节并以这种方式组合它们以获得 16 位整数。

现在想象一下,如果在一个最大整数可能为 64 位的平台上,您想要存储一个大到占用 128 位的整数。好吧,您可以使用与此类似的技巧来伪造数学并将这个非常大的整数存储在两个单独的值中。好吧,也许它比这个例子更复杂,但希望这能让我们明白为什么我们需要像这样的按位运算符。

于 2013-06-21T03:43:17.593 回答