Java 难以理解何时应该/需要使用位移位的示例

Java 难以理解何时应该/需要使用位移位的示例,java,Java,我正在研究人们什么时候想/应该使用位移位运算符。我知道我们不需要用它们乘以2之类的,因为JIT编译将解决这个问题。我偶然发现,并对部分公认的答案感到困惑: 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:

我正在研究人们什么时候想/应该使用位移位运算符。我知道我们不需要用它们乘以2之类的,因为JIT编译将解决这个问题。我偶然发现,并对部分公认的答案感到困惑:

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.
例如,假设我有两个字节,分别是高阶字节和低阶字节
指两字节(16位)无符号值。假设您需要构造该值。
在Java中,这是:
int高=。。。;
int低=。。。;

int twoByteValue=(高作为示例,让我们从数字54321的高阶8位和低阶8位组成数字54321的16位表示:
1101 0100 0011 0001

高阶8位应为:
11010100
低位8位为:
0011 0001

1101 0100 << 8
然后,我们将按位或此(
|
)与低阶位进行比较

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


编辑: 举个例子:
high=10
low=3

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

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

如果我们将高位向左移动8位:

0000 1010 0000 0000
如果我们反对低利率:

0000 1010 0000 0000
          0000 0011
-------------------
0000 1010 0000 0011
如果我们将此模式视为十进制整数,则表示2563

也许让人困惑的是,
10
3
在这个上下文中独立地真的毫无意义。这两者的组合在这里有价值

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


现在想象一下,如果在一个可能的最大整数是64位的平台上,你想存储一个大到占据128位的整数。好吧,你可以使用一个类似于这个的技巧来伪造数学,并将这个真正大的整数存储在两个不同的值中。好吧,也许它比这个例子更复杂,但希望这会使这就明白了为什么我们需要这样的位运算符。

我的问题是,我认为这只是简单地乘以2^8再加上,但这只在某些情况下是正确的。这现在是有意义的。谢谢。
0000 1010 0000 0000
          0000 0011
-------------------
0000 1010 0000 0011