第二章:信息的表示和处理(一)(1)

一,信息储存(Information Storage)

1.1二进制,十六进制以及十进制之间的转化

 这个表格展示了十进制,二进制,以及十六进制对应数字之间的转化。

如果你要在将来的不同的进制转化的快,请跟我一样记住以下几个:

       要记住A,C,F对应的二进制是1010,1100,1111。这样子记忆有什么好处呢,对于B和D我们可以通过A,C加1得到,而E可以由F减1得到。

好了,速记的方法我们先记下,下面我们来看看如何进行二进制,十进制以及十六进制之间的转化。

首先是十六进制转化为二进制:

1.1.1十六进制,二进制互相转化

将十六进制的每个数字根据上面的表格转化为四个位的二进制数字。

举个例子给你个数字0x173A4C,

注:0x或者0X开头的数字都是表示十六进制,在C语言中也是如此。

下面我们将它转化为二进制。

对应的数字如下,那么我们就成功将十六进制转化为二进制了。

那么二进制如何转化为十六进制呢,其实是一样的操作的,不过是反过来的操作,将二进制从右到左每四位转化为对应的十六进制,那么会出现一种情况,有时候左侧的数字到最后不够四位怎么办,很简单,在前面补上0补满四位。

比如二进制数字:101110011101001001100;

我们从右到左看,将它划分为1     0111    0011   1010   0100   1100,左侧不够四位呢,补满补成0001,最终变成0001   0111  0011   1010   0100  1100,每一组转化为对应的十六进制(不会转化参考上面的表格,通过上述的记忆方法可以很快的帮助你进行转化)。也就是转化为1   7   3  A   4  C,其实也就是上面的那个例子。

好了,自此二进制到十六进制之间的桥已经打通了,下面我们来看看二进制到十进制之间的转化。

1.1.2十进制,二进制互相转化

首先是二进制到十进制;

我们采用展开的方法,什么意思呢,我们先来看个例子,比如1001它怎么转化成二进制呢,首先从右到左依次按照2的几次方展开。

就像这样:

        1*2^0+0*2^1+0*2^2+1*2^3=9;

所以转化为十进制就是9;

那么十进制如何转化为二进制呢?

我们采取的是除法,什么意思。

  • 采用"除2取余,逆序排列"法:
1.首先用2整除一个十进制整数,得到一个商和余数
2.然后再用2去除得到的商,又会得到一个商和余数
3.重复操作,一直到商为小于1时为止
4.然后将得到的所有余数全部排列起来,再将它反过来(逆序排列),切记一定要反过来!
  • 假设我们现在需要将42转为二进制,那我们怎么做呢,如下图所示:
     

好了,自此我们二进制转十六进制,二进制转十进制都学会了,按理说,十进制转十六进制我们可以采取先转二进制再转十六进制的方法。但是对于一些特殊的十进制我们可以快速转化为十六进制。

1.1.3特殊十进制数字转化为十六进制

        当十进制数字x=2^n时,我们将n表示为n=i+4j,那么我们可以直接写出它的十六进制数:

1,先写出数字也就是2^i;

2,后面添加0,添加多少个呢?答案是j个;

下面我们举个例子:

比如16384转化为十六进制,首先我们发现可以写成16384=2^14,接下来我们分解14,14/4=3余2

也就是j=3,i=2,所以按照前面的步骤,1,数字为2^2=4;2,填j=3个0;

写出来,十六进制也就是4000,前面填上十六进制的符号0x,写成0x4000,大功告成;

至于当我们看到形如0xn00之类的,也就是一个数字后面全是0的情况就应该想到它的十进制是形如2^n这样的了,n就等于i+4j,比如:0x800,2^i=8,也就是i=3,后面两个0,所以j=2,所以n=i+4j=3+4*2=11,所以十进制是2^11;

我们上面学习了特殊的十进制转十六进制,那么对于一般的十进制呢,能否一步到位直接转为为十六进制呢,答案是肯定的。

1.1.4一般十进制,十六进制互相转化

首先是十进制转化为十六进制,可以采取除法,和上述十进制转二进制类似,只不过2换成16,举个例子

好,那反过来呢,也是利用展开,举个例子:

给定数字0x7AF

 ok,我们进制之间的转化就讲到这里,大家也只需要记住上述的三种进制转化就可以了,因为在计算机中,这三种是最常见的,其他的进制转化大家可以利用网络资源进行解决。

二,代码实现

下面我们给出上述方法的代码,大家感兴趣可以看一下;

二进制转换为十六进制:

#include <stdio.h>
int main(){
   long int binaryval, hexadecimalval = 0, i = 1, remainder;
   printf("输入二进制数: ");
   scanf("%ld", &binaryval);
   while (binaryval != 0){
      remainder = binaryval % 10;
      hexadecimalval = hexadecimalval + remainder * i;
      i = i * 2;
      binaryval = binaryval / 10;
   }
   printf("Equivalent hexadecimal value: %lX", hexadecimalval);
   return 0;
}

 十六进制转化二进制:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void
HextoTwo(int num)
{
    int res;
    int i = 0;
    char buf[BUFSIZ][5] = {"0000"};
    char reference[16][5] = {"0000","0001","0010","0011",\
                        "0100","0101","0110","0111",\
                        "1000","1001","1010","1011",\
                        "1100","1101","1110","1111"};

    while(num / 16 !=  0)
    {
        res = num % 16;
        strcpy(buf[i++], reference[res]);
        num = num / 16;
    }

    res = num % 16;
    strcpy(buf[i++], reference[res]);

    while(i > 0)
        printf("%s ", buf[--i]);
}

int main()
{
    int num = 0xfa;
    HextoTwo(num);
    return EXIT_SUCCESS;
}

二进制转十进制:

#include <stdio.h>
#include <math.h>
 
int convertBinaryToDecimal(long long n);
 
int main()
{
    long long n;
    printf("输入一个二进制数: ");
    scanf("%lld", &n);
    printf("二进制数 %lld 转换为十进制为 %d", n, convertBinaryToDecimal(n));
    return 0;
}
 
int convertBinaryToDecimal(long long n)
{
    int decimalNumber = 0, i = 0, remainder;
    while (n!=0)
    {
        remainder = n%10;
        n /= 10;
        decimalNumber += remainder*pow(2,i);
        ++i;
    }
    return decimalNumber;
}

十进制转化为二进制:

#include <stdio.h>
#include <math.h>
 
long long convertDecimalToBinary(int n);
 
int main()
{
    int n;
    printf("输入一个十进制数: ");
    scanf("%d", &n);
    printf("十进制数 %d 转换为二进制位 %lld", n, convertDecimalToBinary(n));
    return 0;
}
 
long long convertDecimalToBinary(int n)
{
    long long binaryNumber = 0;
    int remainder, i = 1, step = 1;
 
    while (n!=0)
    {
        remainder = n%2;
        printf("Step %d: %d/2, 余数 = %d, 商 = %d\n", step++, n, remainder, n/2);
        n /= 2;
        binaryNumber += remainder*i;
        i *= 10;
    }
    return binaryNumber;
}

十进制转十六进制:

#include<stdlib.h>
#include<stdio.h>

void main()
{
    char arr[] = "0123456789ABCDEF";
    char hex[16];
    int i = 0;
    int j = 0;
    int num = 0, a = 0;
    printf("输入一个整数:");
    scanf_s("%d", &num);
    a = num;
    while (num)
    {
        hex[i++] = arr[num % 16];   //对十进制数求余并最终与hextable数组中的字符匹配
        num = num / 16;
    }
    printf("十进制数%d转换成十六进制数是:", a);
    for (j = i - 1; j >= 0; --j)
        printf("%c", hex[j]);
    printf("\n");
}

十六进制转为十进制: 

#include<stdlib.h>
#include<stdio.h>
void main()
{
    int num = 0;
    printf("输入一个十六进制数: ");
    scanf_s("%x", &num);
    printf("十六进制数 %x 转换为十进制为 %d\n", num, num);
}

总结

通过今天的学习我们了解了十进制,二进制,十六进制之间的转化,了解了一些速记方法和一些小技巧,接下来我们将学习信息存储的其他知识点。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值