我将非常感谢一个很好的教程,它为java新手解释了如何在java中进行所有的“位移位”工作。
我总是偶然发现它,但从来不明白它是如何工作的。它应该解释java中字节移位/位操作的所有可能的操作和概念。
这只是我的一个例子(但我正在寻找一个教程,它解释了所有可能的操作):
byte b = (byte)(l >> (8 - i << 3));
发布于 2011-06-06 17:39:45
好的,官方的Java教程Bitwise and Bit Shift Operators涵盖了Java中可用的实际操作,以及如何调用它们。
如果您想知道“我能用位移位做什么”,那么这不是Java特有的,而且由于它是一种低级技术,我不知道有什么“可以做的很酷的事情”列表。熟悉这些定义是值得的,并让你的眼睛睁大眼睛看看其他使用它的代码,看看他们都做了些什么。
请注意,经常的比特闲置是以牺牲清晰度为代价的效率提升。例如,a << 1
通常与a * 2
相同,但可以说不那么清楚。重复XOR可以在不使用临时变量的情况下交换两个数字,但通常认为使用临时变量更清晰地编写代码更好(或者在实用方法中更好)。因此,在这方面很难给出很好的例子,因为您不太可能在体系结构级别上实现任何新的或深刻的东西;它都是关于低级细节的。(我估计,大量的比特闲置的使用都是过早优化的例子。)
发布于 2012-11-08 04:44:14
使用移位运算符时,要非常小心,不要重复常见的错误!!
正如下面的SO post所建议的,公认答案的作者提到:
“在某些语言中,将移位运算符应用于任何小于整数的数据类型会自动将操作数大小调整为整数。”
例如,当操作字节时,记住这一点绝对至关重要,否则你可能会得到意想不到的结果(就像我做的那样)。
给定一个具有以下位模式的字节:
1001 0000
当我尝试将位移位4,并将其赋值给int时,例如:
int value = byteValue >>> 4;
我期望有:
0000 1001 (or a value of 9)
但我会得到一个巨大的数字!这是因为在位移位操作之前,byteValue被强制转换为int ,因此导致如下所示:
1111 1111 1111 1111 1111 1111 1001
发布于 2011-06-06 17:41:45
有无数种可能的组合。但是,它们将由一个或多个组合组成
>> shift right with sign extension.
>>> shift right with out sign extension.
<< shift left.
为了获得理解,我建议您将二进制数写在纸上,并计算出发生了什么。试图在教程中阅读它并不能保证理解。特别是如果他们到目前为止还没有帮助的话。
https://stackoverflow.com/questions/6250114
复制相似问题