Java“位移”教程?

我会很感激一个很好的教程,这解释了对于Java新手如何在Java所有的“位移”工作。

我总是偶然发现,但从来没有理解它是如何工作的。 它应该解释所有在java中使用字节转换/位操作的操作和概念。

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

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

那么,正式的Java教程Bitwise和Bit Shift Operators涵盖了Java中可用的实际操作,以及如何调用它们。

如果你想知道“我能做些什么?”,那么这不是Java特有的,因为它是一个低层次的技术,我不知道任何“你可以做的很酷的事情”本身。 有必要熟悉这些定义,并保持你的眼睛在其他代码的地方打开,看看他们做了什么。

要注意的是,经常以比特币为代价的是提高效率,但是要求清晰。 例如, a << 1通常与a * 2相同,但可以说不太清楚。 重复XOR可以在不使用临时variables的情况下交换两个数字,但通常认为使用临时variables更清楚地编写代码(甚至在实用程序方法中更好)可以更好地编写代码。 所以在这方面很难举出很好的例子,因为在架构层面你不可能达到任何新的或深刻的东西。 这一切都是关于低层次的细节。 (而且我估计,“野外”的大量使用是不成熟的优化的例子。)

当使用移位操作符时,请注意不要重复常见的错误!

正如以下SOpost所示,接受答案的作者提到:

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

例如,在字节操作时记住这一点是非常重要的,否则你可能会得到意想不到的结果(就像我做的那样)。

给定一个以下位模式的字节:

 1001 0000 

当我试图按位移动4,并分配给一个int,如:

 int value = byteValue >>> 4; 

我希望有:

 0000 1001 (or a value of 9) 

但我会得到一个很大的数字! 这是因为在比特移位操作之前 byteValue被转换为int,所以导致如下的结果:

 1111 1111 1111 1111 1111 1111 1001 

有无数的可能的组合。 但是,它们将由一个或多个组合组成

 >> shift right with sign extension. >>> shift right with out sign extension. << shift left. 

为了理解,我build议你在纸上写下二进制数字,并计算出发生了什么。 尝试在教程中阅读它并不能保证理解。 特别是如果他们没有帮助到目前为止。

有简单但清晰的教程,我觉得这里有用

这不完全是一个教程,但我有一个Java 的位移function的个人库 ,你非常欢迎研究!

此外,如果你做谷歌search“按位技巧”,你会发现很多的材料。 其中许多是C / C ++,但通常转换为Java,因为大部分语法是相同的。

以下是移位工作的细节 。 有一些非直观的行为,不包括官方教程。 例如,右操作数的范围是有限的(int为0-31,long为0-63),如果超出范围,将不会产生警告 – 它只会截断比特(即%32或%64 ),这可能会给你以外的行为。

这个网站似乎给了一个相当不错的教程,你可以用位操作做什么(所以不是特定于Java,但因为它很容易翻译)

http://www.bogotobogo.com/cplusplus/quiz_bit_manipulation.html

上面的教程提供了

  • 按位操作
  • 设置和清除一个位
  • 用位显示一个整数
  • 将十进制转换为hex
  • 位数整数(个数)
  • 整数的位设置位置
  • 就位整数与位操作交换
  • 将整数A转换为整数B所需的位数
  • 在整数中交换奇数和偶数位
  • 什么(n&(n-1)== 0)正在检查?
  • 两个的补充
  • Flipe整数的第n位
  • 浮点数位模式
  • 一个整数的位模式回文

这是一个有一堆java实现的文件

http://geekviewpoint.com/

这些是我在学习移位时发现的两个很好的教程,他们不是在java中,但大多数语言使用相同的操作符,理论是相同的。

  1. 位twiddling
  2. Jim Plush的PHP按位教程