/**
* 测试移位运算符<br/>
* "<<" 左移 : 右侧补0<br/>
* ">>" 带符号右移 : 左侧补符号位:正数补0,负数补1<br/>
* ">>>"无符号右移 : 左侧补0<br/>
*/
public class TestShift {
public static void main(String[] args) {
testLeftShift();
testRightShift();
testUnsignedRightShift();
}
/**
* 左移: 右侧补0
*/
public static void testLeftShift(){
int num = -8;
int shift = 2;
leftShift(num, shift);
leftShift(-num, shift);
System.out.println("--------------");
}
/**
* 左移: 右侧补0
*/
public static void leftShift(int num, int shift){
// num 左移 shift位
int r = num << shift;
System.out.println("向左移位: "+ num +" << "+shift);
System.out.println("移位前:"+binary(num));
System.out.println("移位后:"+binary(r));
System.out.println("");
}
/**
* 测试带符号右移: 左侧补符号位
*/
public static void testRightShift(){
int num = -8;
int shift = 2;
rightShift(num, shift);
rightShift(-num, shift);
System.out.println("--------------");
}
/**
* 带符号右移: 左侧补符号位
*/
public static void rightShift(int num, int shift){
// num 左移 shift位
int r = num >> shift;
System.out.println("(带符号)向右移位: "+ num +" >> "+shift);
System.out.println("移位前:"+binary(num));
System.out.println("移位后:"+binary(r));
System.out.println("");
}
/**
* 测试右移: 左侧补0
*/
public static void testUnsignedRightShift(){
int num = -8;
int shift = 2;
unsignedRightShift(num, shift);
unsignedRightShift(-num, shift);
System.out.println("--------------");
}
/**
* 右移: 左侧补0
*/
public static void unsignedRightShift(int num, int shift){
// num 左移 shift位
int r = num >>> shift;
System.out.println("无符号向右移位: "+ num +" >>> "+shift);
System.out.println("移位前:"+binary(num));
System.out.println("移位后:"+binary(r));
System.out.println("");
}
public static String binary(int i){
return alignRight(Integer.toBinaryString(i),32,'0');
}
/**
* 向右对齐
* @param str 原始字符串
* @param digit 需要的总位数
* @param addChar 添加的字符
* @return
*/
public static String alignRight(String str, int digit, char addChar){
str = String.valueOf(str);
digit = digit > 0 ? digit : 0;
StringBuilder builder = new StringBuilder(digit);
builder.append(str);
for (int len = str.length(); len < digit; len++) {
builder.insert(0, addChar);
}
//
return builder.toString();
}
}