gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:52:30 24 4
gpt4 key购买 nike

我正在研究什么时候想要/应该使用位移运算符。我知道我们不需要使用它们乘以 2 等,因为 JIT 编译会解决这个问题。我遇到了why do we need to use shift operators in 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 = 10low = 3 .

最佳答案

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

高 8 位将是:1101 0100低 8 位将是:0011 0001

1101 0100 << 8

会产生
1101 0100 0000 0000

然后我们将这个( | )与低位进行按位或运算
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

如果我们 OR 那对低:
0000 1010 0000 0000
0000 0011
-------------------
0000 1010 0000 0011

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

也许令人困惑的部分是 103在这种情况下,独立真的没有任何意义。正是两者的组合在这里有值(value)。

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

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

关于java - 难以理解何时应该/需要使用位移位的示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17227307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com