位移运算符[duo9]

来源:互联网 发布:网易 mysql 编辑:程序博客网 时间:2024/04/29 09:38

      Java中的位移运算符,是比较令初学者迷惑的地方,尤其是数学基础不好的。至少当初我是如此。
       位移运算符(Shift operators)用来操作位,仅仅可以用在基本的整数类型上。
       它们分为:
             左移运算符号(<<);
             右移运算符号(>>);
             Java中还有一种特殊的,无正负号的右移运算符(>>>)
      
        (1)左移动运算符:
              会将操作的数向左边移动,移动的位的个数由右操作数指定,左移后,低位会被自动补零(0)。
        (2)右移动运算符:
            反过来,把操作数向右移动,移动的位个数同样由右操作数指定。注意:面对带正负号的数,会采用符号扩展,如果原值是正数,则高位补上0;如果原值是负数,高位补1。
        (3)无正负号的右移运算符(>>>):
              采用0补充,意思就是说,无论是正号还是负号,都在高位补0。

        如果你操作数是比如char,byte,short,位移运算之前,会转型为int,正如前面所说,位移运算符仅仅可以用在类型为int的数值上。

          
例:
    public class URShift{
         public static void main(String[] args){
             int i=-1;
             i>>>=10;
             System.out.println(i); 
        }
    }

java: 4194303

怎样工作:
用二进制表示时最高位用0或1表示正负
0表示正 1表示负(不是仅最高为1 而是所有的高位都是1)

>>  是带符号右移   右移时左边补符号位
>>> 是不带符号右移  右移时左边补零

所以两者在处理 正数时是一样的 左边都补零
但在处理负数时就有区别了 >>补1 >>>补0

所以 -1
1111 1111 1111 1111 1111 1111 1111 1111B
i >>>= 10 后
0000 0000 0011 1111 1111 1111 1111 1111B
= 4194303




原创粉丝点击