我会感谢一个很好的教程,它解释了Java新手如何在java中所有的“位移”工作。
我总是偶然发现它,但从未明白它是如何运作的。它应该解释java中的字节移位/位操作可能实现的所有操作和概念。
这只是我的意思,(但我正在寻找一个解释每个可能操作的教程):
byte b = (byte)(l >> (8 - i << 3));
答案 0 :(得分:34)
嗯,官方Java教程Bitwise and Bit Shift Operators涵盖了Java中可用的实际操作,以及如何调用它们。
如果你想知道“我怎么能进行位移”,那么这不是特定于Java的,而且由于它是一种低级技术,我不知道任何“你可以”做的“很酷的事情”清单SE。值得熟悉这些定义,并睁大眼睛看看使用它的其他代码,看看他们做了什么。
请注意,通常以钻头为单位是效率增益,但会牺牲清晰度。例如,a << 1
通常与a * 2
相同,但可以说不太明确。重复的XOR可以在不使用临时变量的情况下交换两个数字,但通常认为更好的形式是使用临时变量更清楚地编写代码(或者更好,在实用程序方法中)。所以在这方面很难给出很好的例子,因为你不可能在架构层面上取得任何新的或深刻的东西;这都是关于低级细节的。 (而且我估计大量使用“野外”的比特是过早优化的例子。)
答案 1 :(得分:14)
使用移位操作符时,请务必小心不要重复常见错误!!
如下面的SO post所示,接受的答案的作者提到:
“在某些语言中,将移位运算符应用于任何小于int的数据类型会自动将操作数调整为 整数“。强>
这对于记住以字节操作为例非常重要,否则你可能会得到意想不到的结果(正如我所做的那样)。
给定一个具有以下位模式的字节:
1001 0000
当我尝试按位移位4并分配给int时,例如:
int value = byteValue >>> 4;
我希望有:
0000 1001 (or a value of 9)
但我会得到一个巨大的数字!那是因为 byteValue 被转换为int BEFORE 位移操作,因此产生了类似的结果:
1111 1111 1111 1111 1111 1111 1001
答案 2 :(得分:13)
有无数种可能的组合。但是它们将由一个或多个
的组合组成>> shift right with sign extension.
>>> shift right with out sign extension.
<< shift left.
为了获得理解,我建议你在纸上写下二进制数字并弄清楚会发生什么。尝试在教程中阅读它并不能保证理解。特别是如果他们到目前为止没有帮助。
答案 3 :(得分:9)
有一个简单但清晰的教程,我觉得有用here
答案 4 :(得分:5)
这不完全是一个教程,但我有一个Java个人library of bit-shifting functions,欢迎你学习!
此外,如果您对"bitwise tricks"进行谷歌搜索,您会发现很多内容。其中许多是C / C ++,但通常很容易转换为Java,因为大多数语法是相同的。
答案 5 :(得分:5)
以下是details of how bit shifting works。 官方教程没有涉及一些非直观的行为。例如,右操作数的范围有限(int为0-31,long为0-63),如果超出该范围则不会产生警告 - 它只会截断位(即%32或%64) ),这可能会给出你期望的行为。
答案 6 :(得分:3)
这个网站似乎提供了一个很好的教程,你可以用bit操作做什么(所以不是特定于java,但因为它很容易翻译)
http://www.bogotobogo.com/cplusplus/quiz_bit_manipulation.html
上面的教程提供了
这是一个包含大量java实现的文件
答案 7 :(得分:2)
这是我在学习有关位移的过程中发现的两个很好的教程,它们不是在java中,但大多数语言使用相同的运算符,理论是相同的。