java中移位有:左移<<、右移>>(有符号右移和无符号右移)
1.左移
左移运算,在"<<"符号左边的操作数低位补0(移多少位就补多少个0),例:0x12 << 3,先将十六进制数0x12转换成二进制结果为"0001 0010"(十六进制中的一位对应二进制中的四位),在二进制的低位补三个"0",补"0"后的二进制为"0000 1001 0000",将其转换为十六进制结果为0x90,将十六进制转换成十进制结果为144.
/**
* 左移
*/
public static void testLeftMove(){
int u=0x12;
System.out.println("============二进制:"+Integer.toBinaryString(u));
for(int t=1;t<=3;t++){
int a=u <<=1;
System.out.println(Integer.toBinaryString(a));
System.out.println("=========="+a);
}
}
2.右移
右移运算,将">>"符号左边的操作数向右移动,移动的位数为">>"符号右边的操作数,如果是正数,在左边空位上补"0",如果为负数,则在左边的空位中补1,例:016 >> 3,将八进制数016转换成二进制结果为"001 110"(八进制的一位对应二进制中的三位),将其右移3位,低位"110"被移出,因为是正数,在高位中补三个“0“,结果为"000 001"转换成八进制结果为"1",其十进制的结果也为"1".
负数右移运算,例:-18 >> 2,十进制负数的二进制,就是该十进制数的补码,补码的计算是先将正数转换成二进制为"10010",将其取反后的结果为"01101",然后将取反后的值加1结果为"01110","01110"就是"-18"的二进制,将其右移两位,把低位"10"移出,在高位补1(负数补1)结果为"11011",将负数二进制转换成十进制,将"11011"减1结果为"11010",然后取反得到值为"00101","101"的十进制为5,因为符号位为1,所以结果为-5
/**
* 正数右移
*/
public static void testRightMove(){
int k=016;
System.out.println(Integer.toBinaryString(k));
//对K进行有符号位 右移运算
for(int t=1;t<=3;t++){
int a=k >>=1;
System.out.println(Integer.toBinaryString(a));
}
System.out.println("k的二进值为:"+Integer.toBinaryString(k)+" =======k的值为:"+k);
}
/**
* 负数右移
*/
public static void testRightMove(){
int k=-18;
System.out.println(Integer.toBinaryString(k));
//对K进行有符号位 右移运算
for(int t=1;t<=2;t++){
int a=k >>=1;
System.out.println(Integer.toBinaryString(a));
}
System.out.println("k的二进值为:"+Integer.toBinaryString(k)+" =======k的值为:"+k);
}
3.无符号右移
java中的无符号右移符号为">>>",无符号右移是不管是正数还是负数,都在高位补0,例:16 >>> 2,将16转换成二进制结果为"10000",右移两位将低位"00"移出后的值为"00100",转换成十进制结果为4.
/**
* 无符号右移
*/
public static void unsignRightMove(){
int u=16;
System.out.println("============二进制:"+Integer.toBinaryString(u));
for(int t=1;t<=2;t++){
int a=u >>>=1;
System.out.println(Integer.toBinaryString(a));
}
System.out.println("==============================u的二进制值 为:"+Integer.toBinaryString(u)+"==================u的值为:"+u);
}