package com;
/**
*
* 1:算数左移<<,2:算数右移>>,3:逻辑右移>>>
*
* 算数左移:二进制左移,右边补0.
*
* 算数右移:二进制右移。左边补符号位:正数左边补0,负数左边补1。这样保证符号不变。
*
*
* 逻辑右移:二进制右移。左边补0。
* 注意,负数使用补码计算,左补0就会改变负数的符号位!
*
* 所以算数右移>>和逻辑右移>>>对于正数来说没有区别。
*
* @author lushuaiyin
*
*/
public class TestMove {
/**
* @param args
*/
public static void main(String[] args) {
int aa=8;
int bb=-8;
TestMove.move(aa, 1, 2);
TestMove.move(bb, 1, 2);
TestMove.move(aa, 2, 2);
TestMove.move(bb, 2, 2);
TestMove.move(aa, 3, 2);
TestMove.move(bb, 3, 2);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
int cc=9;
int dd=-9;
TestMove.move(cc, 1, 2);
TestMove.move(dd, 1, 2);
TestMove.move(cc, 2, 2);
TestMove.move(dd, 2, 2);
TestMove.move(cc, 3, 2);
TestMove.move(dd, 3, 2);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~\n\n");
int ee=6;
int ff=-6;
TestMove.move(ee, 1, 2);
TestMove.move(ff, 1, 2);
TestMove.move(ee, 2, 2);
TestMove.move(ff, 2, 2);
TestMove.move(ee, 3, 2);
TestMove.move(ff, 3, 2);
}
/**
*
* @param a 整数
* @param moveType 1:算数左移<<,2:算数右移>>,3:逻辑右移>>>
* @param moveStep 移动N
* @return
*/
public static int move(int a,int moveType,int moveStep){
if(moveType==1){//算数左移
System.out.println(a+"算数左移操作:"+"("+a+"<<"+moveStep+")结果:"+(a<<moveStep));
System.out.println("移位前二进制:"+Integer.toBinaryString(a));
System.out.println("移位后二进制:"+Integer.toBinaryString(a<<moveStep)+"\n");
return a<<moveStep;
}else if(moveType==2){//算数右移
System.out.println(a+"算数右移操作:"+"("+a+">>"+moveStep+")结果:"+(a>>moveStep));
System.out.println("移位前二进制:"+Integer.toBinaryString(a));
System.out.println("移位后二进制:"+Integer.toBinaryString(a>>moveStep)+"\n");
return a>>moveStep;
}else if(moveType==3){//逻辑右移
System.out.println(a+"逻辑右移操作:"+"("+a+">>>"+moveStep+")结果:"+(a>>>moveStep));
System.out.println("移位前二进制:"+Integer.toBinaryString(a));
System.out.println("移位后二进制:"+Integer.toBinaryString(a>>>moveStep)+"\n");
return a>>>moveStep;
}else{//其他情况不做处理
System.out.println("其他情况不做处理");
return a;
}
}
}
/*
打印:
8算数左移操作:(8<<2)结果:32
移位前二进制:1000
移位后二进制:100000
-8算数左移操作:(-8<<2)结果:-32
移位前二进制:11111111111111111111111111111000
移位后二进制:11111111111111111111111111100000
8算数右移操作:(8>>2)结果:2
移位前二进制:1000
移位后二进制:10
-8算数右移操作:(-8>>2)结果:-2
移位前二进制:11111111111111111111111111111000
移位后二进制:11111111111111111111111111111110
8逻辑右移操作:(8>>>2)结果:2
移位前二进制:1000
移位后二进制:10
-8逻辑右移操作:(-8>>>2)结果:1073741822
移位前二进制:11111111111111111111111111111000
移位后二进制:111111111111111111111111111110
~~~~~~~~~~~~~~~~~~~~~~~~
9算数左移操作:(9<<2)结果:36
移位前二进制:1001
移位后二进制:100100
-9算数左移操作:(-9<<2)结果:-36
移位前二进制:11111111111111111111111111110111
移位后二进制:11111111111111111111111111011100
9算数右移操作:(9>>2)结果:2
移位前二进制:1001
移位后二进制:10
-9算数右移操作:(-9>>2)结果:-3
移位前二进制:11111111111111111111111111110111
移位后二进制:11111111111111111111111111111101
9逻辑右移操作:(9>>>2)结果:2
移位前二进制:1001
移位后二进制:10
-9逻辑右移操作:(-9>>>2)结果:1073741821
移位前二进制:11111111111111111111111111110111
移位后二进制:111111111111111111111111111101
~~~~~~~~~~~~~~~~~~~~~~~~
6算数左移操作:(6<<2)结果:24
移位前二进制:110
移位后二进制:11000
-6算数左移操作:(-6<<2)结果:-24
移位前二进制:11111111111111111111111111111010
移位后二进制:11111111111111111111111111101000
6算数右移操作:(6>>2)结果:1
移位前二进制:110
移位后二进制:1
-6算数右移操作:(-6>>2)结果:-2
移位前二进制:11111111111111111111111111111010
移位后二进制:11111111111111111111111111111110
6逻辑右移操作:(6>>>2)结果:1
移位前二进制:110
移位后二进制:1
-6逻辑右移操作:(-6>>>2)结果:1073741822
移位前二进制:11111111111111111111111111111010
移位后二进制:111111111111111111111111111110
*/
1:算数左移<<,2:算数右移>>,3:逻辑右移>>>
最新推荐文章于 2023-11-02 11:52:56 发布