java中的移位运算符<< >>

1. <<:左移运算符:把一个数的所有位都向左移动若干位,简单来说就是:i << j = i * 2^j

  • 2<<1=4
    2的二进制为:00000010 ,向左移动1位变成:00000100,即4,相当于2*2^1=4
  • 3<<3=24
    3的二进制为:00000110 ,向左移动3位变成:0011000,即24,相当于3*2^3=24
注意:左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时,编译器会用左移的位数去模类型的最大位数,然后按余数进行移位
总之:左移就是:丢弃最高位,0补最低位

2. >>:右移运算符,右移的概念和左移相反,就是往右边挪动若干位

  • 2>>1=1
    2的二进制为:00000010 ,向右移动1位变成:00000001,即1,相当于2/2^1=1
  • 3>>3=0
    3的二进制为:00000110 ,向右移动3位变成:00000000,即0,移位不够,舍弃为0
  • 4>>2=1
    4的二进制为:00000100 ,向右移动2位变成:00000001,即1,相当于2/2^2=1
注意:当移动的位数超过类型的长度时,会取余数,然后移动余数个位
总之:左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.

例:C语言中左移<<表示乘以2,右移>>表示除以2,这是由计算机工作原理导致的!但是要是7,二进制数为0111,右移一位得3.5,但是右移之后二进制数变成0011,是3。不一样啊,怎么解释呢?
  移位操作符的两个操作数必须是整型的。整个移位表达式的值的类型也是整型的,而且,左移位操作符与右移位操作符的运算并不对称。0111右移一位是把最后一位的1去掉,左边补个0,得0011,转换为十进制是3,这是正确的。并不等同于除以2 。

你可能感兴趣的:(java中的移位运算符<< >>)