亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 十六進制到十進制轉換:自定義邏輯

Java 十六進制到十進制轉換:自定義邏輯

達令說 2021-10-28 17:12:29
我想弄清楚如何將十六進制轉換為字符串和整數,以便我可以通過它的串行端口操作我的 arduino 微控制器上的 RGB 燈。我在 java 網站上找到了一個很好的例子,但是我很難理解其中的一些方法,而且我被掛斷了。我可以輕松地復制粘貼此代碼并使其工作,但我想完全理解它。我將在我的理解中添加評論,希望有人可以提供一些反饋。public class HexToDecimalExample3{    public static int getDecimal(String hex){    //this is the function which we will call later and they are declaring string hex here. Can we declare string hex inside the scope..?    String digits = "0123456789ABCDEF";      //declaring string "digits" with all possible inputs in linear order for later indexing             hex = hex.toUpperCase();        //converting string to uppercase, just "in case"             int val = 0;                    //declaring int val. I don't get this part.             for (int i = 0; i < hex.length(); i++)  //hex.length is how long the string is I think, so we don't finish the loop until all letters in string is done. pls validate this             {                   char c = hex.charAt(i);     //char is completely new to me. Are we taking the characters from the string 'hex' and making an indexed array of a sort? It seems similar to indexOf but non-linear? help me understand this..                 int d = digits.indexOf(c);  //indexing linearly where 0=1 and A=11 and storing to an integer variable                 val = 16*val + d;           //How do we multiply 16(bits) by val=0 to get a converted value? I do not get this..             }               return val;  }  public static void main(String args[]){    System.out.println("Decimal of a is: "+getDecimal("a"));  //printing the conversions out.System.out.println("Decimal of f is: "+getDecimal("f"));  System.out.println("Decimal of 121 is: "+getDecimal("121"));  }}    總結一下評論,主要是 char c = hex.charAt(i); AND val = 16*val + d; 我不明白的部分。
查看完整描述

1 回答

?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

好的,讓我們一行一行

public static int getDecimal(String hex)

hex 是參數,它需要在那里聲明,所以你可以在調用函數時傳遞一個字符串。

String digits = "0123456789ABCDEF";

是的,這聲明了一個字符串,其中包含可以出現在十六進制數中的所有字符。

hex = hex.toUpperCase();

它將十六進制字符串中的字母轉換為大寫,以使其保持一致,即無論輸入哪個,您總是有 F 而從來沒有 f。

int val = 0;

這是稍后將包含相應十進制值的變量。我們將使用此變量進行計算。

for (int i = 0; i < hex.length(); i++)

hex.length()是提供的十六進制字符串中的字符數。我們對每個字符執行一次 for 循環中的代碼。

char c = hex.charAt(i);

是的,char 代表單個字符。我們從索引 i 處的十六進制字符串中檢索字符,因此在第一次迭代中它是第一個字符,在第二次迭代中是第二個字符,依此類推。

int d = digits.indexOf(c);

我們查看字符在 digit-String 中的索引。通過這種方式,我們確定了這個特定數字的十進制表示。就像 0-9 保持 0-9 而 F 變成 15。

val = 16*val + d;

讓我們想想我們必須做什么。我們有數字的十進制值。但是在十六進制中,我們將這個數字放在一個特定的位置,它會與它相乘。就像'100'中的'1'實際上不是1,而是100 * 1,因為它在這個位置。十六進制的10是十進制的16,因為我們有1 * 16?,F在這里的方法有點復雜。val 不是未初始化的。val 開始時為 0,然后包含來自先前迭代的累積值。由于 String 中的第一個字符是最高位置我們不直接知道我們必須乘以什么,因為我們不知道數字有多少位(實際上我們知道,但這種方法沒有使用這個) . 所以我們只需將數字值添加到它。在連續迭代中,它將乘以 16 以將其放大到相應的數字基值。讓我給你看一個例子:


25F作為十六進制數?,F在第一次迭代取 2 并將其轉換為 2 并將其添加到 val。在16 * val0做出決議,從而不能有效地在第一時間。

下一次迭代將 2 與 16 相乘,并取 5(轉換為 5)并將其添加到 val。所以現在我們有了(我用數學方法把它分開,所以你理解它): 2 * 16 + 5

接下來我們得到十進制 15 的 F。我們將 val 乘以 16 并加上 15。

我們得到2 * 256 + 5 * 16 + 16 (* 1),這實際上是您如何以數學方式計算此十六進制值的十進制值。

計算 val 的另一種可能性是:

val += Math.pow(16, hex.length() - i - 1) * d;


查看完整回答
反對 回復 2021-10-28
  • 1 回答
  • 0 關注
  • 160 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號