十进制到十六进制有助于理解

时间:2020-10-09 22:27:30

标签: java

 import java.util.*;

public class Dec2Hex {
    public static void main (String[] args){
        Scanner input new Scanner (System.in);
        
        System.out.print("Enter a decimal number:  ");
        int decimal = input.nextInt();
        
        String hex = "";
        
        while (decimal != 0) {
            int hexValue = decimal % 16;
            char hexDigit = (0 <= hexValue && hexValue <= 9)?
               (char)(hexValue + '0'):  (char)(hexValue - 10 + 'A');
               
               hex = hexDigit + hex;
               decimal = decimal/16;
               
        }
        System.out.println("The hex number is  " + hex);
    }
}

这是我书中的一个例子。我了解其中的大部分内容,但不能完全掌握其中的几个部分。该示例使用1234作为输入的小数。

  1. 1234/16的余数是2,所以hexValue是2。因此hexDigit是2 +'0'。但是hexDigit是一个字符,那么将2和'0'相加或相加是什么意思?
  2. 最终答案是4D2。我们曾在代码中的哪个地方提供过除“ A”以外的任何字母的说明? 是怎么想到的?

谢谢!

5 个答案:

答案 0 :(得分:2)

我现在了解到,条件的第二部分是羚羊数字,例如“ 13”,减去10并将其加到“ A”上。 3 + Unicode中的“ A”为“ D”。

我仍然不明白在条件的第一部分添加“ 0”。我们不能只说(char)(hexValue)吗?为什么加上“ 0”?

谢谢!

答案 1 :(得分:1)

  1. 1234/16的余数是2,所以hexValue是2。因此hexDigit是2 +'0'。但是hexDigit是一个字符,那么将2和'0'相加或相加是什么意思?

2是一个整数值,但是变量类型为char。将这样的值分配给char变量没有问题,但是这将导致0x02字符/字节,它是control character,而不是可见字符。要显示的ASCII表中的数字从0x30开始(即数字'0')。要获取要保存在char变量中的字符值,请添加具有偏移量2的计算值0x30。为了简化计算,您可以使用表达式'0'。这是0x30(或十进制的48)的确切值。

  1. 最终答案是4D2。我们曾在代码中的哪个地方提供过除“ A”以外的任何字母的说明? 是怎么想到的?

计算如下:

  1. 1234除以1677,其余为2
  2. 77除以164,其余为13(即D)。
  3. 4除以160,其余为4

结果为4D2。要验证:

4*16*16 + 13*16 + 2 = 1234

答案 2 :(得分:0)

每个char的值都介于0到256之间,这些数字中的每一个编码可打印的符号。

例如,“ 0”的值为48,而“ A”的值为65。

因此,当向字符添加常量偏移量时,就像在该编码中转到该偏移量一样。

例如'0'+ 5为'5',或'A'+ 3为'D'。

关于您的问题:

  1. “ 0” + 2为“ 2”,即可打印字符2。
  2. 在代码中hexValue的值为13,因此hexDigit获得了值(hexValue-10 +'A'),即(hexValue-10 +'A')= 13-10 +'A'='A '+ 3 ='D'。

答案 3 :(得分:0)

2 + '0' = 2 + 48 = 50
(char)50 = '2'

请注意

'0' = 48
'1' = 49
'2' = 50
...
'9' = 57

选中ASCII Table,以了解有关ASCII值的更多信息。

演示:

public class Main {
    public static void main(String[] args) {
        System.out.println((char) 50);
    }
}

输出:

2

答案 4 :(得分:0)

Ascii table用于字符类型,因此字符可以用十进制值表示。例如:

  • “ 0”(十进制48)
  • 十进制49中的“ 1”
  • “ 2”(十进制50)
  • ...
  • “ 9”(十进制数57)
  • 十进制65的“ A”
  • 'B'十进制66
  • “ C”(十进制67)
  • 'D'以十进制数68
  • ...
  • “ Z”(十进制90)
  • “ a”(十进制97)
  • 'b'以十进制数98
  • ...
  • 十进制数122中的“ z”

请记住,这里是您问题的答案:

我们专注于生产线

char hexDigit = (0 <= hexValue && hexValue <= 9)?
           (char)(hexValue + '0'):  (char)(hexValue - 10 + 'A');
  1. 1234/16的余数是2,所以hexValue是2。因此hexDigit是 2 +'0'。但是hexDigit是一个字符,所以...的含义是什么 结合还是加2和“ 0”?

对于这个问题,感兴趣的部分是

(char)(hexValue + '0')

hexValue 为2,所以 hexValue +'0'为50,因为在ascii表中'0'的十进制值为48。强制转换为50以上的值到char,按ascii表为'2'。

  1. 最终答案是4D2。我们曾在代码中提供的位置 除“ A”以外的其他字母的说明?它是怎么想到的 'D'?

对于这个问题,感兴趣的部分是

(char)(hexValue - 10 + 'A')

hexValue 为13。通过asci表,“ A”的值为65,而“ D”的值为68。因此hexValue-10为3,并且我们将3与“ A”相加我们得到68。最后我们将其强制转换为char并获得“ D”。

您可以通过执行以下代码轻松测试答案:

public class Main {
public static void main(String[] args) {
    System.out.println("Decimal value: "+(2+'0')+"   Char value:" +(char)(2+'0'));
    System.out.println("Decimal value: "+(3 + 'A')+"   Char value: "+ (char)(3+'A'));
}

} 问候