Java 爪哇语;“位移位”;辅导的

Java 爪哇语;“位移位”;辅导的,java,bit-manipulation,bit-shift,Java,Bit Manipulation,Bit Shift,我非常感谢有一个好的教程,它为java新手解释了如何在java中使用所有的“位转移”工作 我总是偶然发现它,但从来都不明白它是如何工作的。它应该解释java中字节移位/位操作可能的所有操作和概念 这只是一个例子,我的意思是,(但我正在寻找一个教程,解释每一个可能的操作): byte b=(byte)(l>>(8-i好吧,正式的Java教程介绍了Java中可用的实际操作,以及如何调用它们 如果您想知道“我可以用位移位做什么”,那么这不是Java特有的,因为它是一种低级技术,我不知道有任何“您可以做

我非常感谢有一个好的教程,它为java新手解释了如何在java中使用所有的“位转移”工作

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

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


byte b=(byte)(l>>(8-i好吧,正式的Java教程介绍了Java中可用的实际操作,以及如何调用它们

如果您想知道“我可以用位移位做什么”,那么这不是Java特有的,因为它是一种低级技术,我不知道有任何“您可以做的很酷的事情”的列表。熟悉这些定义并关注使用它的其他代码是值得的,看看它们做了什么


请注意,通常位旋转是以牺牲清晰度为代价的效率提高。例如,
a有无限多个可能的组合。但是,它们将由一个或多个

>> shift right with sign extension.
>>> shift right with out sign extension.
<< shift left.
>使用符号扩展右移。
>>>右移,不带伸出标志。

这不完全是一个教程,但我有一个Java个人教程,非常欢迎您学习


此外,如果你在谷歌上搜索,你会发现很多资料。其中许多资料都是C/C++的,但由于大多数语法都是相同的,所以通常很容易转换成Java。

有一个简单但清晰的教程,我觉得很有用。

这个网站似乎提供了一个很好的教程,介绍了如何使用位操作(因此不是特定于java,但因为它很容易翻译)

上面的教程提供了

  • 位运算
  • 设置和清除一点
  • 显示带位的整数
  • 十进制到十六进制的转换
  • 整数中设置的位数(位数)
  • 整数的位集位置
  • 带位操作的就地整数交换
  • 将整数A转换为整数B所需的位数
  • 交换整数中的奇偶位
  • 什么(n&(n-1)==0)正在检查
  • 二元补码
  • 翻转整数的第n位
  • 浮点数位模式
  • 整数的位模式回文
下面是一个包含大量java实现的文件


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


  • 使用换档操纵器时,请务必小心,不要重复常见错误

    如下所示,公认答案的作者提到:

    “在某些语言中,对小于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
    
    这是你的电话号码。
    有一些官方教程中没有涉及的非直观行为。例如,右操作数的范围有限(int为0-31,long为0-63),如果超出该范围,则不会产生警告—它只会截断位(即%32或%64),这可能会产生超出您预期的行为。

    这是位移位,而不是字节移位。谢谢,我更新了标题(您更快;-)你可能想看看这个页面:对于所有感兴趣的人来说,除了下面的答案之外,上面Mike的链接绝对值得一读!另一方面,我喜欢
    1@Paŭlo:事实上这是我观点的一个很好的例子。虽然Java很冗长,但我更喜欢
    Math.pow
    这里,因为它声明了意图。事实上egers在后台实现为二进制,这使得两个算术的威力可以用更少的字符(可能还有CPU周期)表示为
    ,如果有整数指数运算符,我也更喜欢它。但是没有,而且Math.pow是在
    值上定义的。(由于Java已经使用了
    ^
    进行位/逻辑异或运算,所以我们不会得到这样的运算符。)我认为仅
    1位运算对于诸如由BuffereImage创建的RGB颜色之类的事情是有用的。至于“酷操作”在Java中,它可能是X=X^Y;Y=Y^X;X=X^Y;应用程序可能看起来很有限,但如果您处理的是内存受限的嵌入式系统,或者希望认真优化性能,那么它就有了ts使用。链接不再工作。解决此问题的一个很好的方法是制作位掩码(在本例中为0000 1111),并使用掩码对结果进行&ing,以强制删除潜在的扩展前导1。
    
    1111 1111 1111 1111 1111 1111 1001