在Java中,<<、>>、>>>都是位运算符
<<表示左移,在低位补0,相当于相乘2*n(n表示左移个数);
例如: 10<<4; 10的二进制数为:0000 1010, 左移4位变成:1010 0000 等于2的7次方(128)加2的5次方(32),结果为:160;
正好等于10*16, 即10*2*4;
>>表示右移,如果该数为正,则高位补0,若为负数,则高位补1;如果是正数相当于除以(2*n);
例如: 10>>1; 0000 1010右移1位变成:0000 0101 等于2的2次方(4)加2的0次方(1),结果为:5;
-10>>1; -10的二进制数为其正数的补码加1(符号位不变):1111 0110, 最高位作为符号位,正数为0,负数为1。右移1位变成:
1111 1011,结果为-5;(计算:减1取反,即为0000 0101 其结果为5,剩下的就是加个负数符号)
原码:如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n- 1位表示概数的绝对值。
例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100
补码:补码也非常的简单就是在反码的基础上按照正常的加法运算加1。
例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101
移码:不管正负数,只要将其补码的符号位取反即可。
例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101,[X]移=01010101
>>>表示无符号右移,也叫逻辑右移,无正负之分,右移后高位同样补0。
例如 10 >>> 1, 其的结果与 10>>1 相同;
-10 >> 1, -10的二进制为 1111 0110,右移1位,此时高位补0,即 0111 1011,结果为 123;