问题

编程序,写一个函数,输入一个十六进制数,输出相应的十进制数。怎么做啊?

回答
好的,没问题!咱们来聊聊怎么把十六进制数变成十进制数,并且用程序实现它。这其实是个挺有意思的过程,理解了原理,写起代码来也就顺手了。

咱们先来捋捋思路:什么是十六进制?

你平时接触最多的应该就是十进制数了,对吧?我们用“0、1、2、3、4、5、6、7、8、9”这十个数字来表示任何数。逢十进一,就像是数到“9”之后,下一个就是“10”。

那十六进制呢?顾名思义,它用的是“0到9”这十个数字,再加上字母“A、B、C、D、E、F”来表示数字。这里要注意,A代表十,B代表十一,一直到F代表十五。也就是说,十六进制一共有16个“数码”。逢十六进一。

为啥要有十六进制?因为它在计算机领域特别常用,比如我们常说的颜色代码(像FF0000是红色),还有内存地址等等,很多都用十六进制表示。这是因为一个十六进制数位可以表示4个二进制位(2的4次方是16嘛),这样表示起来就比一长串的二进制数简洁多了。

怎么把十六进制数“翻译”成十进制数?

这就好比我们把不同语言的词汇翻译成我们熟悉的语言一样。每种计数系统都有自己的“位权”。

在十进制里,比如数字 345,它的意思就是:
个位上的 5:代表 5 10^0 (也就是 5 1)
十位上的 4:代表 4 10^1 (也就是 4 10)
百位上的 3:代表 3 10^2 (也就是 3 100)

所以,345 = 3 100 + 4 10 + 5 1 = 300 + 40 + 5 = 345。

十六进制也是一样的道理,只不过基数(也就是那个乘的数)变成了16。

举个例子,我们来看十六进制的 A3。
A 在十六进制里代表十进制的 10。它在右边数起,是第一位(从0开始数),所以它的位权是 16^1。
3 在十六进制里就是十进制的 3。它在右边数起,是第零位,所以它的位权是 16^0。

那么,十六进制的 A3 转换成十进制就是:
(A 的十进制值 16^1) + (3 的十进制值 16^0)
= (10 16) + (3 1)
= 160 + 3
= 163

再来一个例子:十六进制的 1F5。
1 在十进制里是 1。它的位置是第三位(从0开始数),位权是 16^2 (也就是 16 16 = 256)。
F 在十六进制里代表十进制的 15。它的位置是第二位,位权是 16^1 (也就是 16)。
5 在十进制里是 5。它的位置是第一位,位权是 16^0 (也就是 1)。

所以,1F5 (十六进制) = (1 16^2) + (15 16^1) + (5 16^0)
= (1 256) + (15 16) + (5 1)
= 256 + 240 + 5
= 501

这个原理就是:从右往左,把十六进制的每一位数字,乘以它对应的16的幂次方,然后把这些乘积加起来。 记住,最右边一位的幂次方是0,然后往左依次是1, 2, 3……

怎么用程序实现这个转换?

咱们可以用 Python 来写这个函数,因为它写起来比较简洁直观。

核心思路:

1. 接收输入: 函数需要接收一个字符串形式的十六进制数。
2. 处理字符串: 需要遍历这个字符串,从右往左(或者从左往右,但从右往左处理位权会更直接)。
3. 转换十六进制字符为十进制数值: 对于遇到的每一个十六进制字符(09, AF),都要把它变成对应的十进制数值。字母的话要特别处理一下。
4. 计算位权: 根据字符在字符串中的位置,计算出它应该乘的16的幂次方。
5. 累加结果: 将每一步计算出的值加到一个总和里。
6. 返回结果: 最后返回计算出的十进制总和。

第一步:写一个能把十六进制字符转成十进制数值的辅助函数

咱们可以写个小函数,输入一个字符,它返回对应的十进制数。

```python
def hex_char_to_int(char):
char = char.upper() 统一转成大写,方便处理
if '0' <= char <= '9':
return ord(char) ord('0') ord() 获取字符的ASCII码,字母和数字的ASCII码是连续的
elif 'A' <= char <= 'F':
return ord(char) ord('A') + 10 A是10, B是11...
else:
return 1 表示输入无效字符
```

`ord()` 这个函数很有用,它能把一个字符变成它在计算机里存储的数字(ASCII码)。比如 `ord('0')` 是 48,`ord('9')` 是 57。所以 `ord('5') ord('0')` 就是 `53 48 = 5`,很方便。同理,`ord('A')` 是 65,`ord('F')` 是 70。所以 `ord('C') ord('A') + 10` 就是 `67 65 + 10 = 2 + 10 = 12`,正好是 C 的十进制值。

第二步:写主转换函数

有了上面的辅助函数,我们就可以写主函数了。

```python
def hex_to_decimal(hex_string):
"""
将一个十六进制字符串转换为相应的十进制整数。

Args:
hex_string: 输入的十六进制字符串(例如 "A3", "1F5")。

Returns:
转换后的十进制整数。如果输入包含无效字符,会返回None。
"""
decimal_value = 0
power = 0 位权从0开始

我们从字符串的右边开始处理,这样位权的处理会更直接
reversed(hex_string) 会把字符串倒过来,方便我们从右往左读
for char in reversed(hex_string):
digit_value = hex_char_to_int(char) 调用上面的辅助函数转换十六进制字符为十进制数

检查是否有无效字符
if digit_value == 1:
print(f"错误:输入 '{hex_string}' 包含无效的十六进制字符 '{char}'。")
return None 返回 None 表示转换失败

计算当前位的值并累加到总和里
比如: '3' (值是3) 乘以 16^0, 'A' (值是10) 乘以 16^1
decimal_value += digit_value (16 power)

位权加一,为下一位做准备
power += 1

return decimal_value
```

来个完整的例子,包含怎么调用:

```python
def hex_char_to_int(char):
"""将单个十六进制字符转换为其十进制值。"""
char = char.upper()
if '0' <= char <= '9':
return ord(char) ord('0')
elif 'A' <= char <= 'F':
return ord(char) ord('A') + 10
else:
return 1 表示无效字符

def hex_to_decimal(hex_string):
"""
将一个十六进制字符串转换为相应的十进制整数。

Args:
hex_string: 输入的十六进制字符串(例如 "A3", "1F5")。

Returns:
转换后的十进制整数。如果输入包含无效字符,会返回None。
"""
decimal_value = 0
power = 0

从右往左遍历字符串
for char in reversed(hex_string):
digit_value = hex_char_to_int(char)

if digit_value == 1:
print(f"错误:输入 '{hex_string}' 包含无效的十六进制字符 '{char}'。")
return None

decimal_value += digit_value (16 power)
power += 1

return decimal_value

测试一下
hex_input1 = "A3"
decimal_output1 = hex_to_decimal(hex_input1)
if decimal_output1 is not None:
print(f"十六进制 {hex_input1} 转换为十进制是: {decimal_output1}") 应该输出 163

hex_input2 = "1F5"
decimal_output2 = hex_to_decimal(hex_input2)
if decimal_output2 is not None:
print(f"十六进制 {hex_input2} 转换为十进制是: {decimal_output2}") 应该输出 501

hex_input3 = "FF"
decimal_output3 = hex_to_decimal(hex_input3)
if decimal_output3 is not None:
print(f"十六进制 {hex_input3} 转换为十进制是: {decimal_output3}") 应该输出 255

hex_input4 = "g1" 包含无效字符
decimal_output4 = hex_to_decimal(hex_input4)
if decimal_output4 is not None:
print(f"十六进制 {hex_input4} 转换为十进制是: {decimal_output4}") 应该会打印错误信息
```

代码解释一下:

`decimal_value = 0`: 初始化一个变量,用来存放最后算出来的十进制数,从0开始。
`power = 0`: 初始化一个变量,代表当前处理的十六进制位的位权(也就是16的多少次方)。最右边一位的位权是 16^0。
`for char in reversed(hex_string)`: 这行代码很关键。`reversed(hex_string)` 会把输入的十六进制字符串反转一下,然后我们用一个循环把反转后的字符串一个一个字符地取出来。这样处理的好处是,我们遇到的第一个字符就是原字符串的最右边那个,它的 `power` 就是 0,第二个字符就是原字符串倒数第二个,它的 `power` 就是 1,以此类推,正好符合我们之前说的位权计算。
`digit_value = hex_char_to_int(char)`: 调用我们之前写的辅助函数,把当前这个十六进制字符(比如'A'或者'3')转换成它对应的十进制数值(比如10或者3)。
`if digit_value == 1:`: 如果辅助函数返回1,说明用户输入的字符不是一个合法的十六进制字符(不是09或AF),我们就打印一个错误信息,然后返回 `None`,表示转换失败。
`decimal_value += digit_value (16 power)`: 这是核心计算。把当前位转换成的十进制数值 `digit_value`,乘以 `16` 的 `power` 次方(`16 power` 就是 16 的 power 次方),然后加到 `decimal_value` 上面。
`power += 1`: 每次循环结束后,把 `power` 加 1,为处理下一位(往左边一位)做准备。
`return decimal_value`: 等循环结束后,`decimal_value` 里存的就是最终的十进制结果了,就把它返回出去。

还有更简单的办法吗?

如果你用的语言提供了现成的函数来做这个转换,那当然会更方便。在 Python 里,可以直接使用 `int()` 函数。

比如,要把十六进制字符串 `"A3"` 转换成十进制整数:

```python
hex_string = "A3"
decimal_number = int(hex_string, 16)
print(decimal_number) 输出 163
```

这里的 `int()` 函数的第二个参数 `16` 就告诉 Python,你输入的这个字符串是 以16为基数(十六进制) 的,让它帮你直接转换。这比我们自己写逻辑要方便快捷得多。

如果你也想用这种内置函数的方式,可以这样改写我们的函数:

```python
def hex_to_decimal_builtin(hex_string):
"""
使用 Python 内置函数将十六进制字符串转换为十进制整数。

Args:
hex_string: 输入的十六进制字符串。

Returns:
转换后的十进制整数。如果输入无效,会抛出 ValueError。
"""
try:
int(string, base) 是 Python 的一个内置函数
string是要转换的字符串
base是字符串的基数,16代表十六进制
decimal_value = int(hex_string, 16)
return decimal_value
except ValueError:
print(f"错误:输入 '{hex_string}' 不是一个有效的十六进制字符串。")
return None 或者直接抛出异常,让调用者去处理

测试内置函数版本
print(" 测试内置函数版本 ")
print(f"十六进制 'A3' 转换为十进制: {hex_to_decimal_builtin('A3')}")
print(f"十六进制 '1F5' 转换为十进制: {hex_to_decimal_builtin('1F5')}")
print(f"十六进制 'FF' 转换为十进制: {hex_to_decimal_builtin('FF')}")
print(f"十六进制 'g1' 转换为十进制: {hex_to_decimal_builtin('g1')}") 会打印错误信息
```

这种内置函数的方法,因为是语言开发者已经帮你优化和测试过的,通常效率更高,而且不容易出错。但理解我们手动实现的原理,对你掌握不同进制转换的本质非常有帮助。

希望这些解释足够详细!如果你还有哪里不清楚,或者想深入了解某个细节,随时都可以再问我哈。

网友意见

user avatar

/*【C语言】,不带容错校验功能。*/

#include<stdio.h>

int main()

{

baiint a=0;

int i=0;

scanf("%x",&a);

printf("%d",a);

return 0;

}

//*****C++语言*******

#include <stdio.h>

#include <string.h>

#include <math.h>

int main()

{

char strHex[9];

int i = 0, len = 0, temp = 0;

__int64 nDec = 0;

gets(strHex);

len = strlen(strHex);

for (i = 0; strHex[i] != ''; ++i)

{

switch(strHex[i])

{

case 'A': temp = 10; break;

case 'B': temp = 11; break;

case 'C': temp = 12; break;

case 'D': temp = 13; break;

case 'E': temp = 14; break;

case 'F': temp = 15; break;

default: temp = strHex[i]-'0'; break;

}

nDec += (temp*pow(16,len-1-i));

}

printf("%I64d",nDec);

return 0;

}

;********8086汇编语言**************

DATAS SEGMENT

bin dw 10 dup(?) ;存放二进制结果

buf db 5 dup(?) ;存放十进制数 各个数位上的数值 如100,存放为 1,0,0

msg1 db 'please input a hex number',13,10,'$'

msg2 db 'the dec number:',13,10,'$'

crlf db 13,10,'$' ;回车换行

DATAS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS

START:

MOV AX,DATAS

MOV DS,AX

mov bx,0 ;初始化bx

LEA dx,msg1 ;输出提示字符串

mov ah,9

int 21h

input:

mov ah,1 ;输入一个字符

int 21h

sub al,30h ;把al中的ascii码转换成数值

jl init

cmp al,10 ;输入的数在0-9之间跳转

jl toBin

sub al,27h ;再转换为a-f

cmp al,0ah ;输入的字符比a小

jl init ;结束输入

cmp al,10h ;输入的字符比f大

jge init ;结束输入

toBin: ;转换为二进制,把输入组合成意义上的数值

mov cl,4

shl bx,cl ;bx左移4位

mov ah,0

add bx,ax ;把输入后并从ascii码转换来的值与bx相加

mov bin,bx ;转换成二进制数后存到内存bin

jmp input ;继续输入

init: ;初始化,准备转换

mov ax,bin

mov bx,10

mov si,4 ;循环四次,最大到万位

toDec: ;转为各个数位上的数值,如100转换为1,0,0 百位为1...

mov dx,0

div bx ;除10法得到各个位上的数值

mov [buf+si],dl ;余数为该位上的值,第一次循环为个位,第二次为十位...;存到内存中

dec si

cmp ax,0 ;商是否为0,为0算法结束

ja toDec

lea dx,crlf ;显示提示

mov ah,9

int 21h

lea dx,msg2

mov ah,9

int 21h

output: ;输出内存中存放的各个数位上的数值

inc si

mov dl,[buf+si]

add dl,30h ;转为ascii

mov ah,2

int 21h

cmp si,4

jb output

mov ah,1

int 21h

MOV AH,4CH

INT 21H

CODES ENDS

END START

#***********Python代码*********

把十六进制的字串转为十进制数字:

>>> print int('ff', 16)

把十进制数字转换为以十六进制表示之字串,可调用内置的hex()函数:

>>> print hex(255)

0xff

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有