JAVA的進位制間的轉換方法
進位制:又名進位制,是人們規定的一種進位方法。比如二進位制就是逢二進一;
位(bit):就是代表二進位制資料箇中的每一個0或1,bit是計算機中的最小單位。計算機基本儲存單位是位元組(byte),包含8個二進位制位,即1 byte = 8 bit。以下是整數資料型別所佔用的記憶體空間:
--->整數預設為int型別
Java針對整數常量提供了4種進製表現形式:
二進位制:由0,1組成,以0b開頭。
八進位制:由0,1,…7組成,以0開頭。
十進位制:由0,1,…9組成,整數預設是十進位制的。
十六進位制:由0,1,…9,a,b,…f,大小寫均可,以0x開頭。
注:任何資料在計算機中都是以二進位制
如果生成值為60的int型別的資料,他在記憶體中會佔用32位(bit)的記憶體空間,如下:
0000-0000 0000-0000 0000-0000 0011-1100(二進位制)
0 0 0 0 0 0 3 C (十六進位制)
00 00-0 000 000 0-00 00 0 000-000 0 00 11-1 100(二進位制)
0 0 0 0 0 0 0 0 0 7 4 (八進位制)
實現進位制間轉換有三種方法:
方法一:數學公式計算實現
將十進位制數除以轉換進位制數(2/8/16),直到商為零停止,最後將餘數從下到上排列起來。即實現了十進位制到其它進位制的轉變。相反,實現其它進位制到十進位制的轉變只需要將:其它進位制數從左到右依次乘以該進位制數位置的次冪,之後相加即可:比如二進位制數111100轉化為十進位制數60 --> 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 = 60。
程式碼實現如下:
/*
將10進位制轉化為二進位制或八進位制
由於使用的是餘數乘以10的位數次方的方法來輸出相應的進位制數,因此指適用於10進位制以內的轉換
*/
import java.lang.Math;
public class Excerise {
private int t = 0; //用來記錄位數
private int bin = 0; //用來記錄最後的二/八進位制數
private int r = 0; //用來儲存餘數
public Excerise(){} //定義空的構造方法
/*
將十進位制轉為二進位制或八進位制;
n為10進位制數,m是將要轉化的目標進位制數
*/
public void transform(int m,int n){
assert m == 2 || m == 10 || m == 8;
while(n != 0){
r = n % m; //取餘
n = n / m; //取商
bin += r * Math.pow(10,t); //Math.pow(10,t)表示10的t次方
t++;
}
System.out.println(bin);
}
public static void main(String[] args){
Excerise trans = new Excerise();
trans.transform(8,60); //將60轉化為八進位制數
}
}
方法二:利用“移位”操作實現
這裡有關於移位操作的詳細程式碼:https://www.cnblogs.com/challengingtime/p/4688809.html
方法三:呼叫JAVA的API
java中有封裝好的Integer類,用於進位制之間的相互轉換:
Integer.toBinaryString(n):十進位制n轉2進位制;
Integer.toOctalString(n):十進位制n轉8進位制;
Integer.toHexString(n):十進位制n轉16進位制;
Integer.toString(n, r):十進位制n轉r進位制;
注:上述方法的返回值都是字串。
Integer.parseInt((String) s,(int) radix):將radix進位制的字串s轉為10進位制。
public class Excerise02 {
public static void main(String args[]){
int n = 60;
System.out.println(n + "的二進位制是:" + Integer.toBinaryString(n));
System.out.println(n + "的八進位制是:" + Integer.toOctalString(n));
System.out.println(n + "的十六進位制是:" + Integer.toHexString(n));
System.out.println(n + "的三進位制是:" + Integer.toString(n, 3));
String s = "111100";
System.out.println(s + "的十進位制是:" + Integer.parseInt(s, 2));
}
}
-------------------------------------------------------------------
60的二進位制是:111100
60的八進位制是:74
60的十六進位制是:3c
60的三進位制是:2020
111100的十進位制是:60