关于java移位运算

来源:互联网 发布:终结者2审判日 知乎 编辑:程序博客网 时间:2024/06/05 05:46
看到一个在java的源代码中,java.lang.Integer.java中循环左移的实现如下所示:
Javacode
?
1
2
3
public static int rotateLeft(int i, int distance) {
    return (i << distance) (i >>> -distance);
}


对于那个无符号右移一个负数位不泰明白 然后就找了一下。  找了这一篇参考 弄懂了。
原文:http://www.ticmy.com/?p=46

一、
  int value =Integer.parseInt(“00001111101001011111000010101100″,2);//即value=262533292
 
  对int变量value执行<<32位操作,即value<<=32,这个结果是多少呢?
  如果你觉得答案是0,那么错了,它的结果还是262533292。
 不用怀疑java中int是32位的问题,而是你没有了解java的<<操作。
  在java中无论左移右移,会遵循下面的规则

  value<<n(其中value为int,n>=0) 等价于value<<(n2)
  value>>n (其中value为int,n>=0) 等价于value>>(n2)
  value>>>n (其中value为int,n>=0) 等价于value>>>(n2)
 
  对于long类型的:
  value<<n(其中value为long,n>=0) 等价于value<<(nd)
  value>>n (其中value为long,n>=0) 等价于value>>(nd)
  value>>>n (其中value为long,n>=0) 等价于value>>>(nd)
 
  而对于byte、short、char遵循int的规则
 
 二、
  int value =Integer.parseInt(“00001111101001011111000010101100″,2);//即value=262533292
  value <<= -38,这个结果是多少呢?
  你可能认为它通不过编译,抑或你认为它从左移变成右移了?
 然而,事实不是想象的那么简单,它的结果是-1342177280,这是怎么出来的?听我一一道来。
  若是对int的值移负数位,java会截取那个负数的低5位。
 -38的二进制表示是:11111111111111111111111111011010,截取低5位得:11010,这个数是26,也就是说:
  value <<= -38 等价于 value <<=26,得到的二进制是10110000000000000000000000000000,首位为1,
 所以该二进制是补码,换成其绝对值的源码为01010000000000000000000000000000,对应的十进制为1342177280,
  加上负号就是-1342177280。
  对于int是取低5位,对于long是取低6位
  也就是说:
   value <<-n(value为int,n>=0) 等价于 value << (-n & 31)
   value >>-n(value为int,n>=0) 等价于 value >> (-n & 31)
   value >>>-n(value为int,n>=0) 等价于 value >>> (-n & 31)
 
  而对于long
   value <<-n(value为long,n>=0) 等价于 value << (-n & 63)
   value >>-n(value为long,n>=0) 等价于 value >> (-n & 63)
   value >>>-n(value为long,n>=0) 等价于 value >>> (-n & 63)
  
  而对于byte、short、char遵循int的规则

0 0
原创粉丝点击