Java小白进阶之二---移位操作符

来源:互联网 发布:海岛大亨5 for mac 编辑:程序博客网 时间:2024/05/27 09:46
  • 前提:移位操作符操作的运算对象是二进制的“位”。移位操作符只可用来处理【整形值】

  • java中有三种移位运算符

<<      :     左移运算符,按照操作符右侧指定的位数将操作符左边的操作数向左移动(在低位补零)。例如:num << 1,相当于num乘以2
       左移的规则只记住一点:丢弃最高位,0补最低位
       运算规则:按二进制的形式把所有数字向左移动对应的位数,高位移出(舍弃),高低位的空位补0.(如果移动的位数超过了该类型的最大位数,编译器会对移动的位数取模,如对int型移动了33位,实际上只移动   了:33%32=1位)

>>      :     右移运算符,按照操作符右侧指定的位数将操作符左边的操作数向右移动(若符号为正,在高位插入0;若符号为负,在高位插入1)。例如: num >> 1,相当于num除以2
       右移的规则只记住一点:符号位不变,左边补上符号位
       运算规则:按二进制的形式把所有数字向右移动对应的位数,低位移出(舍弃),高位的空位补符号位,即正数补0,负数补1

>>>    :     无符号右移,忽略符号位,空位都以0补齐(只对32位和64位的值有意义

  • 为什么说左(右)移相当于乘(除)以2(按移动一位来说)?  
 
因为当左移运算时,所有的位都向左移动一位,在转十进制数时,相当于每一位多乘了一个2然后相加,也就相当于总体多成了一个2;右移同理

  • 关于其他类型进行移位操作

    1. 如果对于char、byte或者short类型的数值进行移位处理,那么在移位进行之前,它们会先被转为int类型,并且得到的结果也是一个int类型的值。
注意:只有数值右端的低五位才有用。这样可防止我们移位超过int型值所具有的位数(因为2的5次方为32,而int型值只有32位)

               2.如果对于一个long类型的数值进行处理,最后的到的结果也是long。此时只会用到数值右端的低6位,以防止移位超过long型数值具有的位数

  • “移位”与“等号”的组合使用问题(<<=或>>=或>>>=)

      此时,操作符左边的值会移动由右边的值指定的位数,再将得到的结果赋给左边的变量。但在进行“无符号”右移位结合赋值操作时,可能会遇到一个问题:如果对byteshort值进行这样的移位运算,得到的可能不是正确的结果。原因:它们会先被转成int类型,再进行右移操作,然后被截断,赋值给原来的类型,在这种情况下可能得到-1的结果。

1 0