Java“Bit Shifting”教程?

时间:2011-06-06 09:36:30

标签: java bit-manipulation bit-shift

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

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

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

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

8 个答案:

答案 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

上面的教程提供了

  • 按位操作
  • 设置和清除位
  • 使用位显示整数
  • 将十进制转换为十六进制
  • 整数中设置的位数(一个数目)
  • 整数的位设置位置
  • 带位操作的就地整数交换
  • 将整数A转换为整数B所需的位数
  • 以整数交换奇数和偶数位
  • 什么(n&amp;(n-1)== 0)正在检查?
  • Two's Complement
  • 擦除整数的第n位
  • 浮点数位模式
  • 整数的位模式回文

这是一个包含大量java实现的文件

http://geekviewpoint.com/

答案 7 :(得分:2)

这是我在学习有关位移的过程中发现的两个很好的教程,它们不是在java中,但大多数语言使用相同的运算符,理论是相同的。

  1. Bit twiddling
  2. PHP Bitwise Tutorial by Jim Plush