二进制,十进制,十六进制转化

本文详细阐述了二进制、十进制、十六进制之间的转换方法,包括2进制转16进制、16进制转2进制、2进制转10进制、10进制转2进制等。同时,介绍了原码、反码、补码的概念及其在有符号数表示中的应用。此外,还讨论了二进制加法及补码表示的数值范围。
摘要由CSDN通过智能技术生成

思前想后:

9a8d0b324ff4e91afcb50df95a45899a.png

例:

接下来我们细致理解进制之间的转换,首先我们理解下二进制,十进制,十六进制。

从我们熟悉的10进制说起,也就是逢10进1,即从0……9,当9再加1就进位。同理:

 

2进制即逢2进1,即从0到1,当1再加1就进位。

 

16进制即逢16进1,即从0……F (F就是15),当F再加1就进位。

一:2进制转换为16进制:

把二进制数从低位到高位每4位组成一组,每一组直接用16进制数来表示即可,例如:

0011 0101 1011 1111

3      5    B    F

 例如:

 

位置:  1             1             1                1

       2∧3 *1       2∧2*1        2∧1*1         2∧0*1

 权:    8            4              2               1

 

这里很好拼凑,1,2,4,8权相对应的位置只要是1,咱们加起来就可以了。

头四位(0011)末尾俩1:(1+2=3)

接着四位(0101)从右到左第1,第三位为1:(1+4=5)

接着(1011):(1+2+8=B)

最后(1111):(1+2+4+8=F)

记住1,2,4,8的顺序就好了。

所以 0011010110111111B=35BFH

(注意:十六进制数以H为后缀,十进制D,八进制O,二进制B,这里的末尾B和H是强调是什么进制的)

二:16进制转为2进制

把16进制数中每一位用4位为二进制数来表示(不足四位用0补充),即可得到相对应的二进制数,例如:

  A    1    9   C

1010 0001 1001 1100

同上(在1,2,4,8中),A=2+8,所以二进制数中从右到左第2位和第四位是1,即1010

9=1+8,所以在二进制数从右到左第一位和第四位是1,即1001

三:2进制转换为10进制数

各位二进制数码乘以与其对应的权之和即为与该二进制数对应的十进制数:例如

   1             0     .      1            0

2∧1 *1     2∧0 *0  .  2∧(-1)*1     2∧(-2)*0

2∧1 *1   + 2∧0 *0  .  2∧(-1)*1   +  2∧(-2)*0

=2.5

1011100.10111B = 2^6+2^4+2^3+2^2+2^-1+2^-3+2^-4+2^-5 = 92.71875D

四:10进制转换为2进制

(注意:十六进制数以H为后缀,十进制D,八进制O,二进制B,这里的末尾B和H是强调是什么进制的)

把要转换的十进制数的整数部分不断除以2,并计下余数,直到商为0为止,例如:

整数N=117D

117/2=58余1(a0=1)

58/2=29余0 (a1=0)

29/2=14余1(a2=1)

14/2=7 余0 (a3=0)

7/2=3余1 (a4=1)

3/2=1余1(a5=1)

1/2=0余1(a6=1) 用短除法更快一点

即N=117D=1110101B

对于被转换的十进制数的小数部分则应不断乘以2,并计下其整数部分,直到结果的小数部分为0为止

例如小数 N=0.8125D

0.8125*2=1.625 (b1=1)

0.625*2=1.25 (b2=1)

0.25*2=0.5 (b3=0)

0.5*2=1.0 (b4=1)

所以N=0.8125D=0.1101B

五:16进制数转换为10进制数

各位十六进制数与其对应权值的乘积之和即为相应的十进制数,例如:

N=BF3CH

=11*16^3+15*16^2+3*16^1+12*16^0

=48956D

六:10进制转换为16进制

1:可以先转换为2进制再转换为16进制

2:除法:把要转换的十进制数的整数部分不断除以16,并记下余数,直到商为0为止:例如:

N=48956D

48956/16 = 3059 余12(a0=12)

3059/16=191 余3 (a1=3)

191/16=11 余15 (a2=15)

11/16 = 0 余11 (a3=11)

所以:N=48956D = BF3CH

原码,补码,反码

原码:最高位表示符号(正数用0,负数用1),其它位表示数值位,称为有符号数的原码表示法,如图,两个原码区别就是最高位一个是0,一个是1。为什么属于有符号呢,因为他可以表示正数也可以表示负数,那你占了一个位用于表示 ± 后,表示数据大小的只能有7位了,最大为 1111 111即2∧7-1。

N=45=00101101B 【N】原码=0 0101101B

M=-45 【M】原码=1 0101101B

反码:正数的反码与原码相同,符号位用0表示,数值位值不变。负数的反码符号位用1表示,数值位为原码数值为按位取反形成,即0变1,1变0,例如:

N=45=00101101B 【N】反码=0 0101101B

M=-45 【M】反码=1 1010010B

补码:正数的补码与原码相同,即符号位用0表示,数值位值不变。负数的补码为反码加1形成,例如:

N=45=00101101B 【N】补码=00101101B

M=-45 【M】补码=11010011B

例如:11000111=-57计算方式:

最高位为1,先加负号

接着取反码+1=00111001=57

即-57

1073a5c7fb67411f0a07ab54d42326ce.png

二进制加法

在这个例子当中

25 的原码:00011001 -25的补码为:11100111

32 的原码:00100000 -32的补码为:11100000

即-25等于25的反码+1

最终的结果为 11000111即-57,将其反码加1之后转化为十进制为57(验证了结果的正确性)

在这里11000111最前面应该还有个1,在这里系统将其抛弃了(但不是彻底抛弃,这里的进位被PSW寄存器里记录了,去掉他并不影响结果)

补码的表数范围

N位二进制数能够表示的 无符号整数范围:0 ~ 2^n - 1

如8位:0~255 (8个位都表示数值了,最大2^8-1)

N位二进制数能够表示的 有符号整数范围:-2^(n-1) ~ 2^(n-1) - 1

如8位:-128~127 (因为最高位0,1表示正负,其余7位才表示数值,最大2^7-1)

计算11111111转换为十进制数:

  • 无符号:2^8-1=255
  • 有符号:最高位是1,先确定是负数

接着取反码:0000 0000

接着+1

0000 0001 = 1

加上确定是负数,最终结果为-1

所以无符号时为255,有符号时为-1

 

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二进制数和十六进制数的相互转换 c6下完美运行通过 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> void convert(char *input, char *output) { int len1 = strlen(input); //输入二进制数位数 int pos = len1 / 4 + 1; //输出十六进制数的位数 if (len1 % 4 == 0) { pos = pos - 1; } int j = 0; while (len1>0) { char sum = 0; for (int i=0; i<4 && len1>0; i++, len1--) //从最后起每4位算一次值 { sum = sum + (input[len1-1]-'0')*pow(2, i); } // 转换成16进制数表示 sum = sum + '0'; if ('9'<sum && sum<'9'+7) { sum = sum + 7; } else if (sum > '9' + 6) { printf("您输入的不是正确的2进制数!\n"); exit(0); } //十六进制数放到output数组相应位置 output[--pos] = sum; } } int main() { int groupNum = 0; char total[1024] = {0}; scanf("%d", &groupNum); for (int i=1; i<=groupNum; i++) { char input[1024] = {0}; char output[256] = {0}; fflush(stdin); //记得清楚输入缓冲区,否则每次回车会影响 gets(input); convert(input, output); char format[32] = {0}; sprintf(format, "\nCase %d: ", i); strcat(total, format); strcat(total, output); } printf("%s\n", total); } 不分手de恋爱 10:52:05 /二进制数和十六进制数的相互转换 c6下完美运行通过 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> void convert(char *input, char *output) { int len1 = strlen(input); //输入二进制数位数 int pos = len1 / 4 + 1; //输出十六进制数的位数 if (len1 % 4 == 0) { pos = pos - 1; } int j = 0; while (len1>0) { char sum = 0; for (int i=0; i<4 && len1>0; i++, len1--) //从最后起每4位算一次值 { sum = sum + (input[len1-1]-'0')*pow(2, i); } // 转换成16进制数表示 sum = sum + '0'; if ('9'<sum && sum<'9'+7) { sum = sum + 7; } else if (sum > '9' + 6) { printf("您输入的不是正确的2进制数!\n"); exit(0); } //十六进制数放到output数组相应位置 output[--pos] = sum; } } int main() { int groupNum = 0; char total[1024] = {0}; scanf("%d", &groupNum); for (int i=1; i<=groupNum; i++) { char input[1024] = {0}; char output[256] = {0}; fflush(stdin); //记得清楚输入缓冲区,否则每次回车会影响 gets(input); convert(input, output); char format[32] = {0}; sprintf(format, "\nCase %d: ", i); strcat(total, format); strcat(total, output); } printf("%s\n", total); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值