一,信息储存(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);
}
总结
通过今天的学习我们了解了十进制,二进制,十六进制之间的转化,了解了一些速记方法和一些小技巧,接下来我们将学习信息存储的其他知识点。