十进制正整数有符号左移
示例:10 << 2 = 40
Java代码:
public class ShiftTest {
public static void main(String []args){
int leftShiftBegin = 10;
System.out.println("十进制数:" + leftShiftBegin + " , " +
"二进制为:" + Integer.toBinaryString(leftShiftBegin));
int leftShiftAfter = 10 << 2;
System.out.println("左移2位后十进制数:" + leftShiftAfter + ", " +
"二进制为:" + Integer.toBinaryString(leftShiftAfter));
}
}
运行结果:
公式:x << n = x * 2^n
原理:(运算数的二进制整体左移指定位数,低位用0补齐)
在计算机中会将十进制数转为二进制进行运算,10在计算机中转换为二进制为1010,二进制数1010左移2位通俗说就是在末尾补上两个0,即为00101000,转换为十进制0*2^0 + 0*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 0*2^6 + 0*2^7 = 40
十进制负整数有符号左移
示例:-10 << 2 = -40
Java代码:
public class ShiftTest {
public static void main(String []args){
int leftShiftBegin = -10;
System.out.println("十进制数:" + leftShiftBegin + " , " +
"二进制为:" + Integer.toBinaryString(leftShiftBegin));
int leftShiftAfter = -10 << 2;
System.out.println("左移2位后十进制数:" + leftShiftAfter + ", " +
"二进制为:" + Integer.toBinaryString(leftShiftAfter));
}
}
运行结果:
公式:x << n = (x * 2^n)
原理:
原理跟正整数左移还是一样的(运算数的二进制整体左移指定位数,低位用0补齐),为什么-10的二进制会出现这么多的1呢?仔细数一下刚好有32位。首先需要了解的是Java负数存储是以补码形式存储的(补码=反码+1),10的二进制是1010,它的反码就是0101,再加1就是补码0110。那为什么会多出来那么多1呢?这是因为int型在Java中占8个字节,刚好32位,10原码的高位全是0,它的反码自然高位就变成了1。所以整体左移2位,低位以0补齐,最后的运算结果就是x << n = (x * 2^n)。
十进制数有符号右移
示例:10 >> 2
Java代码:
public class ShiftTest {
public static void main(String []args){
int leftShiftBegin = 10;
System.out.println("十进制数:" + leftShiftBegin + " , " +
"二进制为:" + Integer.toBinaryString(leftShiftBegin));
int leftShiftAfter = 10 >> 2;
System.out.println("右移2位后十进制数:" + leftShiftAfter + ", " +
"二进制为:" + Integer.toBinaryString(leftShiftAfter));
}
}
运行结果:
公式:x >> n = x / 2^n(正数移位舍去小数,负数有小数就进一)
原理:按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1