Java“位移”教程?[已关闭]
2022-08-31 23:58:29
我会感谢一个很好的教程,它解释了java新手如何在java中所有“位移位”工作。
我总是偶然发现它,但从未理解它是如何工作的。它应该解释Java中字节移位/位操作可能实现的所有操作和概念。
这只是一个我的意思的例子,(但我正在寻找一个解释每个可能操作的教程):
byte b = (byte)(l >> (8 - i << 3));
我会感谢一个很好的教程,它解释了java新手如何在java中所有“位移位”工作。
我总是偶然发现它,但从未理解它是如何工作的。它应该解释Java中字节移位/位操作可能实现的所有操作和概念。
这只是一个我的意思的例子,(但我正在寻找一个解释每个可能操作的教程):
byte b = (byte)(l >> (8 - i << 3));
好吧,官方Java教程Bitwise和Bit Shift Operators涵盖了Java中可用的实际操作,以及如何调用它们。
如果你想知道“我能用位移位做什么”,那么这不是Java特有的,而且由于它是一种低级技术,我不知道任何“你可以做的很酷的事情”本身。熟悉这些定义是值得的,并睁大眼睛看看使用这种定义的其他代码,看看他们做了什么。
请注意,通常位微调是一种效率提升,但会牺牲清晰度。例如,通常与相同,但可以说不太清楚。重复的XOR可以在不使用临时变量的情况下交换两个数字,但通常认为使用临时变量更清晰地编写代码(或者更好,在实用程序方法中)更好的形式。因此,在这方面,很难给出很好的例子,因为你不太可能在架构层面上实现任何新的或深刻的东西。这都是关于低级细节的。(我估计,“在野外”大量使用位微调都是过早优化的例子。a << 1
a * 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