java 移位運算子,取反運算子 >> >> ~ , java 負數補碼存放規則等同於機器儲存

二十八畫生ing發表於2016-06-11

移位運算程式碼如下:

package SimpleGrammar;

/**
 * 
 * @author jaloli
 * 
 * (1)負數儲存:java 等同於機器,都是用補碼存,補碼的規矩,
 * 		   負數 -2 ,原碼為				    10000000000000000000000000000010
 * 	     補碼是符號位不變,各位取反+1,補碼為   11111111111111111111111111111110
 * 
 * (2)負數移位:(說的是 >> << 移位符號,不是>>>,>>  << 這種是帶符號移位) 兩種移位理解方式,
 * 		   一種是原碼移位,再轉補碼,此時是符號位不變,左移右移都補0
 * 		   另一種是補碼直接移位,右移補1,左移補0
 * (3) >>移位方式與除法的區別: -2>>10 = -1,可看下面運算過程第二個printf,也就是和除法不同,
 * 	          你右移多少位,也移不出0來,最多是-1,除法可以 -1 / 2 == 0
 * (4) >>> 是不帶符號移位:1.只對64 位儲存的二進位制數有效.java int 是32 位(如下程式顯示),所以移位結果不是期待的數
 * 		  2.移位:這個只有右移,無論正負數,統統右移不補0,移幾位,砍掉前多少位,10100>>>2 = 101,然後結果101按照正數來看
 * 		  >>> 作用存疑
 * (5) ~ 取反:取反就是連同符號位一起取反,高位0 扔掉
 */
public class ShiftBit {
	
	public static String printBinary(int number) {
		return Integer.toBinaryString(number);
	}
	
	public static void main(String[] args) {
		int oldValue = -20;  //改成20 看,2,-2 試試
		int shiftNum = 2;
		//oldValue is : 		11111111111111111111111111101100	原數為:-20
		System.out.println("oldValue is : \t\t" + printBinary(oldValue) + "\t原數為:" + oldValue);
		//oldValue >> 2 : 	11111111111111111111111111111011 	運算十進位制結果為: -5
		System.out.println("oldValue >> 2 : \t" + printBinary(oldValue >> shiftNum) + " \t運算十進位制結果為: " + (oldValue >> shiftNum));
		//oldValue << 2  : 	11111111111111111111111110110000 	運算十進位制結果為: -80
		System.out.println("oldValue << 2  : \t" + printBinary(oldValue << shiftNum) + " \t運算十進位制結果為: " + (oldValue << shiftNum));
		//oldValue >>> 2  : 	111111111111111111111111111011 		運算十進位制結果為: 1073741819   這個相當於把左邊的兩位砍掉了,沒補0,缺位了,移幾位缺幾位.1073741819 數按照無符號正數算出來的
		System.out.println("oldValue >>> 2  : \t" + printBinary(oldValue >>> shiftNum) + " \t\t運算十進位制結果為: " + (oldValue >>> shiftNum));
		//取反操作符,~-2
		System.out.println("oldValue 取反  is : \t\t" + printBinary(~oldValue) + "\t原數為:" + oldValue);
	}
}


相關文章