複習筆記1 進制以及進制轉換

import java.io.IOException;

public class Test2
{
	public static void main(String[] args) throws IOException
	{
	
		// java 中 10 8 16進制常數的寫法
		System.out.println(512);
		System.out.println(01000);
		System.out.println(0x200);
		System.out.println("=========================================>");
		
		// 對於負數有符號位移和無符號位移有差別
		// 有符號位移會自動高位補1,無符號將補0,
		// 也就是說-1有符號右移1位爲-1,無符號右移1位爲integer最大值
		System.out.println((-1 >> 1) == (-1 >>> 1));
		System.out.println("=========================================>");
		
		// 打印src的 2 4 8 16 32進制
		int src = -5;
		System.out.println(toUnsignedString(src, 1));
		System.out.println(toUnsignedString(src, 2));
		System.out.println(toUnsignedString(src, 3));
		System.out.println(toUnsignedString(src, 4));
		System.out.println(toUnsignedString(src, 5));
		System.out.println("=========================================>");
		
		//正負數轉換的方法
		src = -100;
		System.out.println(-src);
		System.out.println(conversion(src));
		System.out.println("=========================================>");
		
		//char 可以參加運算實際上是由於他存儲的是整數
		//而由於char是無符號的,所以需要17位來表示,
		//所以纔會看起來像int
		System.out.println('㮆');
		System.out.println(((char)-50298));
		System.out.println("=========================================>");
		
		//減減的實現方式
		//由於計算機不存在減法,減法也是用加法算的
		//所以一個整數加上這個整數類型的無符號最大值
		//就相當於是自減,有符號的看起來像是加了一個
		//-1,但計算機並沒有負數的概念
		int x = 355;
		System.out.println(--x);
		System.out.println((((x + 255) & 0xff) + (0xffffff00 & x)));
		System.out.println(x + 0xffffffff);
		System.out.println("=========================================>");
		
		
		
	}
	
	public final static char[] digits =
	{
	        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c',
	        'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
	        'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
	};
	
	/**
	 * 無符號進制轉換
	 * 
	 * <p>
	 * 每次取出傳入 i 的最後 shift 位,並將該值轉化爲10進制的值進行查表<br>
	 * 最後以倒敘的型式組成字符串
	 * 
	 * @param i 需要轉換的整數
	 * @param shift 表示偏移量,1爲2進制,2爲4進制,3爲8進制,4爲16進制, 5爲32進制
	 * @return 表示該進制型式的字符串
	 */
	public static String toUnsignedString(int i, final/*此處final僅在編譯期有效*/ int shift)
	{
	
		// 該字符數組用來保存每一位的字符表現型式
		char[] buf = new char[32];
		// 字符指針,表示轉換後的第幾位
		int charPos = 32;
		// 基數,表示該進制逢多少進1
		int radix = 1 << shift;
		// 掩碼,表示該進制中的最大數的2進制型式
		int mask = radix - 1;
		
		// 以倒序的型式換算
		//每次取shift表示的進制的位數
		//並將該值轉化爲相應的進制型式字符
		do
		{
			//假設該次爲轉換成2進制,那麼每位最大值爲1
			//即mask爲1,以i & mask 的結果就爲 0 和 1
			//所以在buf中,根據表digits只能有0和1的字符
			buf[--charPos] = digits[i & mask];
			i >>>= shift;
		}
		while (i != 0);
		
		return new String(buf, charPos, (32 - charPos));
	}
	
	/**
	 * 正負數轉換
	 * @param i 需要轉換的數
	 * @return i 的相對數
	 */
	public static int conversion(int i)
	{
		return ~i + 1;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章