十六进制和二进制的转换

该博客展示了用C语言实现二进制与十六进制相互转换的代码。包含字符串反转函数,主函数提供选择界面,可选择将二进制转换为十六进制或反之。还给出了二进制转十六进制和十六进制转二进制的具体函数实现。

#include <stdio.h>

#include <math.h>

#include <string.h>

char* strrev(char* s)

void binary_hex(int n, char hex[]);

int hex_binary(char hex[]);


char* strrev(char* s)

{

    /* h指向s的头部 */

    char* h = s;

    char* t = s;

    char ch;

    /* t指向s的尾部 */

    while(*t++){};

    t--;    /* t++抵消 */

    t--;    /* 回跳过结束符'\0' */

    /* ht未重合时,交换它们所指向的字符 */

    while(h < t)

    {

        ch = *h;

        *h++ = *t;    /* h向尾部移动 */

        *t-- = ch;    /* t向头部移动 */

    }

    return(s);

}


int main()

{

    char hex[20],c;

    int n;

    printf("Instructions:\n");

    printf("Enter h to convert binary to hexadecimal:\n");

    printf("Enter b to hexadecimal number to binary:\n");

    printf("Enter a character: ");

    scanf("%c",&c);

    if (c=='h' || c=='H')

    {

        printf("Enter binary number: ");

        scanf("%d",&n);

        binary_hex(n,hex);

        printf("Hexadecimal number: %s",hex);

    }

    if (c=='b' || c=='B')

    {

        printf("Enter hexadecimal number: ");

        scanf("%s",hex);

        printf("Binary number: %d",hex_binary(hex));

    }

    return 0;

}


void binary_hex(int n, char hex[]) /* Function to convert binary to h. */

{

    int i=0,decimal=0, rem;

    while (n!=0)

    {

        decimal += (n%10)*pow(2,i);

        n/=10;

        ++i;

    }

/* At this point, variable decimal contains binary number in decimal format. */

    i=0;

    while (decimal!=0)

    {

        rem=decimal%16;

        switch(rem)

        {

            case 10:

hex[i]='A';

break;

            case 11:

hex[i]='B';

break;

            case 12:

hex[i]='C';

break;

            case 13:

hex[i]='D';

break;

            case 14:

hex[i]='E';

break;

            case 15:

hex[i]='F';

break;

            default:

hex[i]=rem+'0';

break;

        }

        ++i;

        decimal/=16;

    }

    hex[i]='\0';

    strrev(hex);       /* Function to reverse string. */

}


int hex_binary(char hex[])   /* Function to convert hexadecimal to binary. */

{

    int i, length, decimal=0, binary=0;

    for(length=0; hex[length]!='\0'; ++length);

    for(i=0; hex[i]!='\0'; ++i, --length)

    {

        if(hex[i]>='0' && hex[i]<='9')

            decimal+=(hex[i]-'0')*pow(16,length-1);

        if(hex[i]>='A' && hex[i]<='F')

            decimal+=(hex[i]-55)*pow(16,length-1);

        if(hex[i]>='a' && hex[i]<='f')

            decimal+=(hex[i]-87)*pow(16,length-1);

    }

/* At this point, variable decimal contains the hexadecimal number in decimal format. */

    i=1;

    while (decimal!=0)

    {

        binary+=(decimal%2)*i;

        decimal/=2;

        i*=10;

    }

    return binary;

}

<think>好的,用户让我介绍十六进制二进制转换表。首先,我需要确认自己对这个主题的理解是否正确。十六进制二进制之间的转换是计算机科学中的基础知识,因为它们之间的转换相对简单,因为每个十六进制数字对应四位二进制数。 接下来,我得想想如何组织信息才能让用户容易理解。可能需要先解释两种进制的基数,然后说明转换方法,再提供一个转换表作为参考。同时,用户可能需要具体的例子来理解转换过程,所以应该包括转换步骤的例子。 然后,我需要检查是否有常见的错误点需要注意。例如,四位二进制数不足四位时需要补零,这一点很重要,否则转换会出错。另外,十六进制的字母A到F代表十进制的10到15,这点也需要明确提到。 还要考虑用户的需求。他们可能正在学习计算机基础课程或准备考试,需要快速查阅转换表,或者理解转换的原理以便手动转换。因此,除了提供表格外,分步骤的转换方法也很实用。 在结构上,可能需要分为几个部分:进制简介、转换方法(包括二进制十六进制十六进制二进制的步骤)、转换表、示例以及注意事项。这样结构清晰,用户能逐步理解。 需要确保所有数学表达式使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。例如,当提到四位二进制数时,可能需要写成$1101_2$,对应的十六进制是$D_{16}$。 另外,要使用中文回答,所以术语要准确,比如“十六进制二进制”对应的英文缩写可能需要标注,比如(Hex)(Bin)。 最后,检查转换表是否完整,是否涵盖了所有16个十六进制数字(0-F)及其对应的四位二进制数。可能需要用表格形式展示,但Markdown表格在这里是否适用?用户可能希望看到清晰的排列,所以用文本表格或分列的方式呈现。 现在,整理这些思路,组织成连贯的回答,确保符合用户提供的系统级指令,特别是LaTeX格式结构清晰的要求。同时,确保信息准确无误,比如四位一组的分法是否正确,补零的方法是否正确,例子是否典型,比如二进制数11011010分成11011010,对应的十六进制DA,这样的例子是否正确。</think>十六进制二进制转换是计算机基础中的重要内容,以下是清晰的转换方法参考表: --- ### 一、进制简介 - **二进制 (Bin)**: 基数为2,仅含`0``1`,例如:$1011_2$。 - **十六进制 (Hex)**: 基数为16,含`0-9``A-F`(对应十进制10-15),例如:$B_{16}$。 --- ### 二、转换方法 #### 1. 二进制十六进制 - **步骤**: 1. 从右向左将二进制数**每4位一组**分组,不足4位时左侧补零。 2. 每组直接查表转换十六进制。 - **示例**: - 二进制 `11011010` → 分组为 `1101 1010` → 查表得 `D A` → 结果:$DA_{16}$。 #### 2. 十六进制二进制 - **步骤**: 1. 将每个十六进制字符独立处理。 2. 查表转换为4位二进制,保留前导零。 - **示例**: - 十六进制 `3E` → `3`→`0011`,`E`→`1110` → 合并得 `00111110` → 可简写为 $111110_2$。 --- ### 三、转换对照表 | 十六进制 | 二进制 | 十进制 | |----------|-----------|--------| | 0 | 0000 | 0 | | 1 | 0001 | 1 | | 2 | 0010 | 2 | | 3 | 0011 | 3 | | 4 | 0100 | 4 | | 5 | 0101 | 5 | | 6 | 0110 | 6 | | 7 | 0111 | 7 | | 8 | 1000 | 8 | | 9 | 1001 | 9 | | A | 1010 | 10 | | B | 1011 | 11 | | C | 1100 | 12 | | D | 1101 | 13 | | E | 1110 | 14 | | F | 1111 | 15 | --- ### 四、注意事项 1. **补零规则**:二进制分组时若左侧不足4位,**必须补零**(如`10`→`0010`)。 2. **字母大小写**:十六进制字母可大写(`A-F`)或小写(`a-f`),但需保持统一。 3. **快速验证**:可通过十进制作为中间值辅助验证结果(例如:$B_{16}=11_{10}=1011_2$)。 --- ### 五、练习示例 1. 二进制 `01001111` → 分组 `0100 1111` → 十六进制 $4F_{16}$。 2. 十六进制 `2C` → `2`→`0010`, `C`→`1100` → 合并为 `00101100` → 二进制 $101100_2$。 通过对照表方法,可快速实现两种进制的互转。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值