閱讀393 返回首頁    go 阿裏雲 go 技術社區[雲棲]


十進製轉換成二進製、八進製、十六進製的通用方法

/**
 * 將十進製轉換成二進製、八進製、十六進製
 * 說明:
 * 1)、在JAVA語言一個整數用4個八位表示,即32個二進製位
 * 2)、一個二進製位用0和1表示,最大值是1
 * 3)、一個八進製位表示3個二進製位,最大值是7
 * 4)、一個十六進製位表示4個二進製位,最大值是15
 *
 */
public class DecimalConvert {
	
	public static void main(String[] args) {
		int num = 60;
		System.out.println(num + "轉換成二進製=" + toBinaryString(num));	
		System.out.println(num + "轉換成八進製=" + toOctalString(num));	
		System.out.println(num + "轉換成十六進製=" + toHexString(num));	
	}
	
	/**
	 * 十進製轉成二進製
	 * @param num 要轉換成二進製的整數
	 * @return 轉成二進製後的字符串
	 */
	public static String toBinaryString(int num) {
		return trans(num, 1, 1);
	}
	
	/**
	 * 十進製轉成八進製
	 * @param num 要轉換成八進製的整數
	 * @return 轉成八進製後的字符串
	 */
	public static String toOctalString(int num) {
		return trans(num, 7, 3);
	}
	
	
	/**
	 * 十進製轉成十六進製
	 * @param num 要轉換成十六進製的整數
	 * @return 轉成十六進製後的字符串
	 */
	public static String toHexString(int num) {
		return trans(num, 15, 4);
	}
	
	/**
	 * 進製公共計算方法,提取進製轉換相同的代碼
	 * @param num 要轉換的整數
	 * @param base 要轉換的進製基數,如果是二進製:base=1; 如果是8進製:base=7; 如果是16進製:base=15
	 * @param offset 右移位數,由轉換的進製類型決定。二進製偏移1位,8進製偏移3位,16進製偏移4位
	 * @return 轉成進製後的字符串
	 */
	private static String trans(int num, int base, int offset) {
		if (num == 0) 
			return ""; 
		StringBuffer result = new StringBuffer();
		//存儲二進製、八進製、十六進製的字符表
		char[] chs = new char[] {
				'0','1','2','3',
				'4','5','6','7',
				'8','9','A','B',
				'C','D','E','F'
		};
		
		char[] arr = new char[32];	//JAVA中int用4個二進製八位表示,即32個二進製位,所以存儲的值最大不會超過32位
		
		int pos = arr.length;		//存儲進製值的指針
		
		//開始計算,直到有效位為0才停止計算
		while(num != 0) {
			//與(&)上轉換進製有效位的最大值,如果在16進製中,一個十六進製位表示4個二進製位,4個二進製位的最大值是15,所以這裏的base就是15
			int temp = num & base;	
			//從最大下標位開始存儲,方便取出拚接。temp的值在0-15之間,所以直接將與後的值從字符表中取出來得到相應的進製值
			arr[--pos] = chs[temp];
			//無符號右移,如果是16進製,則右移4位,因為一個十六進製位表示4個二進製位,所以這裏的offset就是4
			num = num >>> offset;
		}
		
		//將計算後的值拚接成相應的進製表示方式,由於是反著存儲的,所以要從最後保存的指針位置開始取才能保證表現的進製數是正確的
		for (int i = pos; i < arr.length; i++) {
			result.append(arr[i]);
		}
		
		return result.toString();
	}

}


最後更新:2017-04-02 06:52:18

  上一篇:go 操作數組的常用方式二-----排序、查找
  下一篇:go 馬士兵 J2SE 第11章 GUI編程 GUI初步和布局管理器