In-Java,C#,Javascript:
AFAIU - >>
是一个右移操作数,可以处理带符号的数字:
没有问题:
12>>2 --> 3
还有签名号码:
-12>>2 --> -3
但是当十进制结果不是整数时,结果是不同的:
10>>2 --> 2
而-10>>2 --> -3
我完全清楚它为什么会发生(通过两个补充),但是:
问题:
这是否意味着当我使用最快的分区>>
时 - 我必须检查:
10%4
不是零?
我在这里遗漏了什么吗?
答案 0 :(得分:1)
您可以使用Integer.numberOfTrailingZeros()
和Long.numberOfTrailingZeros()
等方法判断转移是准确还是截断。
您也可以使用按位AND来测试最后的位,例如测试最后4位:
int i = 543;
if ((i & 0x0f) == i )
System.out.println("Last 4 bits are zeros!");
虽然注意到“快速”分割使用位移是不值得的。你不会超越编译器,因为今天的大多数编译器都足够聪明,可以优化这些情况。
更多相关信息:Is multiplication and division using shift operators in C actually faster?
修改强>:
您的问题的答案是位移未被定义为“有史以来最快的分区”,它被定义为其名称所示:位移,其中在负数的情况下给出(或可能给出)不同的结果。
你没有遗漏任何东西。如果您的输入可能是否定的,那么您的两个选项是: