1 回答

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
好的,讓我們一行一行
public static int getDecimal(String hex)
hex 是參數(shù),它需要在那里聲明,所以你可以在調(diào)用函數(shù)時(shí)傳遞一個(gè)字符串。
String digits = "0123456789ABCDEF";
是的,這聲明了一個(gè)字符串,其中包含可以出現(xiàn)在十六進(jìn)制數(shù)中的所有字符。
hex = hex.toUpperCase();
它將十六進(jìn)制字符串中的字母轉(zhuǎn)換為大寫,以使其保持一致,即無論輸入哪個(gè),您總是有 F 而從來沒有 f。
int val = 0;
這是稍后將包含相應(yīng)十進(jìn)制值的變量。我們將使用此變量進(jìn)行計(jì)算。
for (int i = 0; i < hex.length(); i++)
hex.length()
是提供的十六進(jìn)制字符串中的字符數(shù)。我們對(duì)每個(gè)字符執(zhí)行一次 for 循環(huán)中的代碼。
char c = hex.charAt(i);
是的,char 代表單個(gè)字符。我們從索引 i 處的十六進(jìn)制字符串中檢索字符,因此在第一次迭代中它是第一個(gè)字符,在第二次迭代中是第二個(gè)字符,依此類推。
int d = digits.indexOf(c);
我們查看字符在 digit-String 中的索引。通過這種方式,我們確定了這個(gè)特定數(shù)字的十進(jìn)制表示。就像 0-9 保持 0-9 而 F 變成 15。
val = 16*val + d;
讓我們想想我們必須做什么。我們有數(shù)字的十進(jìn)制值。但是在十六進(jìn)制中,我們將這個(gè)數(shù)字放在一個(gè)特定的位置,它會(huì)與它相乘。就像'100'中的'1'實(shí)際上不是1,而是100 * 1,因?yàn)樗谶@個(gè)位置。十六進(jìn)制的10是十進(jìn)制的16,因?yàn)槲覀冇? * 16。現(xiàn)在這里的方法有點(diǎn)復(fù)雜。val 不是未初始化的。val 開始時(shí)為 0,然后包含來自先前迭代的累積值。由于 String 中的第一個(gè)字符是最高位置我們不直接知道我們必須乘以什么,因?yàn)槲覀儾恢罃?shù)字有多少位(實(shí)際上我們知道,但這種方法沒有使用這個(gè)) . 所以我們只需將數(shù)字值添加到它。在連續(xù)迭代中,它將乘以 16 以將其放大到相應(yīng)的數(shù)字基值。讓我給你看一個(gè)例子:
取25F作為十六進(jìn)制數(shù)?,F(xiàn)在第一次迭代取 2 并將其轉(zhuǎn)換為 2 并將其添加到 val。在16 * val
0做出決議,從而不能有效地在第一時(shí)間。
下一次迭代將 2 與 16 相乘,并取 5(轉(zhuǎn)換為 5)并將其添加到 val。所以現(xiàn)在我們有了(我用數(shù)學(xué)方法把它分開,所以你理解它): 2 * 16 + 5
接下來我們得到十進(jìn)制 15 的 F。我們將 val 乘以 16 并加上 15。
我們得到2 * 256 + 5 * 16 + 16 (* 1)
,這實(shí)際上是您如何以數(shù)學(xué)方式計(jì)算此十六進(jìn)制值的十進(jìn)制值。
計(jì)算 val 的另一種可能性是:
val += Math.pow(16, hex.length() - i - 1) * d;
添加回答
舉報(bào)