Java“位移”教程?[已关闭]

2022-08-31 23:58:29

我会感谢一个很好的教程,它解释了java新手如何在java中所有“位移位”工作。

我总是偶然发现它,但从未理解它是如何工作的。它应该解释Java中字节移位/位操作可能实现的所有操作和概念。

这只是一个我的意思的例子,(但我正在寻找一个解释每个可能操作的教程):

byte b = (byte)(l >> (8 - i << 3));

答案 1

好吧,官方Java教程Bitwise和Bit Shift Operators涵盖了Java中可用的实际操作,以及如何调用它们。

如果你想知道“我能用位移位做什么”,那么这不是Java特有的,而且由于它是一种低级技术,我不知道任何“你可以做的很酷的事情”本身。熟悉这些定义是值得的,并睁大眼睛看看使用这种定义的其他代码,看看他们做了什么。

请注意,通常位微调是一种效率提升,但会牺牲清晰度。例如,通常与相同,但可以说不太清楚。重复的XOR可以在不使用临时变量的情况下交换两个数字,但通常认为使用临时变量更清晰地编写代码(或者更好,在实用程序方法中)更好的形式。因此,在这方面,很难给出很好的例子,因为你不太可能在架构层面上实现任何新的或深刻的东西。这都是关于低级细节的。(我估计,“在野外”大量使用位微调都是过早优化的例子。a << 1a * 2


答案 2

使用换档操作员时,要非常小心,不要重复常见的错误!!

正如以下SO帖子所建议的那样,已接受答案的作者提到:

“在某些语言中,将 shift 运算符应用于任何小于 int 的数据类型会自动将操作数调整为 int。

例如,在对字节进行操作时,记住这一点绝对至关重要,否则您可能会得到意想不到的结果(就像我一样)。

给定具有以下位模式的字节:

1001 0000

当我尝试位移4,并分配给一个int时,例如:

int value = byteValue >>> 4;

我希望有:

0000 1001   (or a value of 9)

但是我会得到一个巨大的数字!这是因为字节值在位移位操作之前被强制转换为int,从而导致如下结果:

1111 1111 1111 1111 1111 1111 1001

推荐