进制转换是人们利用符号来计数的方法。十六进制与十进制之间的转换包括十进制转十六进制和十六进制转十进制

介绍

进制转换是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。位权是指,进位制中每一固定位置对应的单位值。

十进制中的数位排列是这样的…… 万 千 百 十 个 十分 百分 千分……

16进制中的数位排列是这样的…… ……

十六进制在数学中是一种逢16进1的进位制,一般用数字0到9和字母A到F表示,其中:A~F相当于十进制的10~15。

转换

数学计算方法

十进制--->十六进制(余数定理分解)

对于整数部分,用被除数反复除以16,除第一次外,每次除以16均取前一次商的整数部分作被除数并依次记下每次的余数。另外,所得到的商的最后一位余数是所求二进制数的最高位。

对于小数部分,采用连续乘以基数16,并依次取出的整数部分,直至结果的小数部分为0为止。故该法称“乘基取整法”。

给你一个十进制,比如:120,如何将它转换成十六进制数呢?

10进制数转换成十六进制数,这是一个连续除以16的过程:把要转换的数,除以16,得到商和余数,将商继续除以16,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。

比如要转换120为十六进制数:

“把要转换的数,除以16,得到商和余数”,那么:要转换的数是120, 120 ÷ 16,得到商是7,余数是8。

“将商继续除以16,直到商为0……”,现在商是7,还不是0,所以继续除以16。

那就: 7 ÷ 16, 得到商是0,余数是7。现在商已经是0。

我们两次计算依次得到余数分别是:8、7,将所有余数倒序排列,那就是:78。

故120转换成十六进制,结果是78。

把上面的一段改成用表格来表示,则为:

被除数

计算过程

余数

120

120/16

7

8

7

7/16

0

7





被除数

计算过程

余数

120

120/16

7

8

7

7/16

0

7

120转换为16进制,结果为:78。

十六进制--->十进制

16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这六个字母来分别表示10,11,12,13,14,15。字母不区分大小写。

十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……

所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。

假设有一个十六进数 2AF5, 那么如何换算成10进制?

用竖式计算:

2AF5换算成10进制:

第0位:

第1位:

第2位:

第3位:

直接计算就是:

可以看出,所有进制换算成10进制,关键在于各自的权值不同。1

在计算机应用中,通常存在不同进制之间相互转换的问题,计算机内部以0、1代码(二进制数)表示,所以在两个非二进制数互相转换时,通常先将其转换为二进制,再由二进制转换为相应进制。2

编程函数中的进制转换

写在前面:每种编程语言中的进制转换往往有多种方法,下述实现C、C++、Java、C#、Python等语言十进制与十六进制相互转换的一种方案。

C

  • 十六进制转换为十进制:sscanf函数将任意进制的字符串转换为十进制数字

#include <stdio.h>
 
int main()
{ 
    char str[100] = "7fffffff";
    int i = 0;
    sscanf(str, "%x", &i);
    printf("%d\n", i); // 2147483647    
    return 0; 
}
  • 十进制转换为十六进制:C语言的标准库函数printf函数将十进制数字转换为其他任意进制格式,%X格式说明符用于将十进制整数decimalNum转换为十六进制字符串。

#include <stdio.h>
 
int main()
{
    int decimalNum = 255;
    printf("十进制数 %d 转换为十六进制字符串是: %X\n", decimalNum, decimalNum);//FF    
    return 0; 
}

C++

  • 十六进制转换为十进制:使用字符串流stringstream(头文件#include<sstream>)

#include<iostream>
#include<string>
#include<sstream>
using namespace std;

int main(void)
{
    string s="20";
    int a;
    stringstream ss;
    ss<<hex<<s;        //以16进制读入流中
    ss>>a;            //10进制int型输出
    cout<<a<<endl;//输出:32
    return 0;
}
  • 十进制转换为十六进制:使用字符串流stringstream(头文件#include<sstream>)

#include<iostream>
#include<string>
#include<sstream>
using namespace std;

int main(void)
{
    string s;
    int a=30;
    stringstream ss;
    ss<<hex<<a;         //10进制转成十六进制读入流中,再以字符串输出
    ss>>s;            
    cout<<s<<endl;        //输出:1e
    return 0;
}

Java

  • 十六进制转换为十进制:Long.parseLong

public class HelloWorld {
    public static void main(String []args) {
        String hexString = "FF";
        long decimalNum = Long.parseLong(hexString, 16); //考虑到十进制数可能会超出int的范围使用long
        System.out.println(decimalNum);//255

    }
}

注意,Long.parseLong方法在解析失败时会抛出NumberFormatException,因此在实际应用中,您可能需要添加异常处理逻辑来处理可能的输入错误。

  • 十进制转换为十六进制:Integer.toString(decimalNum, 16)方法将十进制整数decimalNum转换为十六进制字符串,其中第二个参数指定转换格式为16进制。toUpperCase()方法用于将转换得到的字符串转换为大写形式。

public class HelloWorld {
    public static void main(String []args) {
        int decimalNum = 255;
        String hexString = Integer.toString(decimalNum, 16).toUpperCase(); // 将十进制数字255转换为十六进制字符串"FF"
        System.out.println(hexString);//FF
    }
}

C#

  • 十六进制转换为十进制:Convert.ToInt32(hexString, 16)方法则将十六进制字符串hexString转换为对应的十进制数,第二个参数同样指定字符串的格式为16进制。

using System;
namespace HelloWorldApplication
{
   class HelloWorld
   {
      static void Main(string[] args)
      {
        string hexString = "FF";
        int decimalNum = Convert.ToInt32(hexString, 16); // 将十六进制字符串"FF"转换为十进制数字255     
        Console.WriteLine(decimalNum);
        Console.ReadKey();
      }
   }
}
  • 十进制转换为十六进制:Convert.ToString(decimalNum, 16)方法将十进制数decimalNum转换为十六进制字符串,其中第二个参数指定转换格式为16进制。ToUpper()方法用于将转换得到的字符串转换为大写形式。

using System;
namespace HelloWorldApplication
{
   class HelloWorld
   {
      static void Main(string[] args)
      {
        int decimalNum = 255;
        string hexString = Convert.ToString(decimalNum, 16).ToUpper(); // 将十进制数字255转换为十六进制字符串"FF"
        Console.WriteLine(hexString);
        Console.ReadKey();
      }
   }
}

Python

  • 十六进制转十进制:int() 函数

def hex_to_decimal(hex_string):
   return int(hex_string, 16)

# 示例
hex_strings = ["AB", "5D9"]#171,1497
for hex_string in hex_strings:
   decimal = hex_to_decimal(hex_string)
   print(f"0x{hex_string} = {decimal}")
  • 十进制转十六进制:内置的hex()函数

def decimal_to_hex(decimal):
   return hex(decimal)[2:]  # [2:] 是用来去除前缀'0x'

# 示例
numbers = [255, 512, 789]
for number in numbers:
   hex_string = decimal_to_hex(number)
   print(f"{number} = 0x{hex_string}")
def decimal_to_hex(decimal):
   return hex(decimal)[2:]  # [2:] 是用来去除前缀'0x'

# 示例
numbers = [255, 512, 789]
for number in numbers:
   hex_string = decimal_to_hex(number)
   print(f"{number} = 0x{hex_string}")

Javascript

  • Javascript 能以 toString() 函数来将十进制数字转为其他任意进位格式(String类型)

const num = 255;
const hexString = num.toString(16).toUpperCase(); // 将十进制数字255转换为十六进制字符串"FF"
console.log(hexString); 
  • 采用 parseInt() 函数将任意进位的字符串转为十进制数字

var hexNum = "FF";
var decimal = parseInt(hexNum, 16); // 将十六进制字符串"FF"转换为十进制数字255
console.log(decimal); 

Perl

  • 十进制转十六进制:

#!/usr/local/bin/perl
# filename: 10to16

for ($i = 0; $i < @ARGV; $i++)
{
    printf("%d\t= 0x%x\n", $ARGV[$i], $ARGV[$i]);
}
  • 十六进制转十进制:

#!/usr/local/bin/perl
# filename: 16to10
for ($i = 0; $i < @ARGV; $i++)
{
    $val = hex($ARGV[$i]);
    printf("0x%x\t= %d\n", $val, $val);
}

用例(类UNIX系统中): 先进入以上文件所在的文件夹,然后执行命令( 确保它们有执行权限 ):

> ./10to16 100 512 789

100 = 0x64

512 = 0x200

789 = 0x315

> ./16to10 AB 5D9

0xAB = 171

0x5D9 = 1497

注意事项:

  • 如果您打算处理大数值,您可能需要考虑使用 %lx 或 %llx来确保数值的宽度。

  • 如果您希望脚本能够处理负数,那么输出可能需要特别注意,因为 printf 会使用不同的格式来表示负数。

  • 如果您希望脚本能够处理浮点数或其他类型的输入,您需要修改脚本以进行检查和适当的转换。

来源: 百度百科

内容资源由项目单位提供