/** * 將十進位轉換成二進位、八進位、十六進位 * 說明: * 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就是15int temp = num & base;//從最大下標位開始儲存,方便取出拼接。temp的值在0-15之間,所以直接將與後的值從字元表中取出來得到相應的進位值arr[--pos] = chs[temp];//無符號右移,如果是16進位,則右移4位,因為一個十六進位位表示4個二進位位,所以這裡的offset就是4num = num >>> offset;}//將計算後的值拼接成相應的進位表示方式,由於是反著儲存的,所以要從最後儲存的指標位置開始取才能保證表現的進位數是正確的for (int i = pos; i < arr.length; i++) {result.append(arr[i]);}return result.toString();}}