进制转换——二进制、八进制、十进制、十六进制、整数与小数部分及补码、原码和反码

十进制转二进制

1、除2取余, 余数倒序; 得到的序列就是二进制表示形式
2、例如: 将十进制(100) 转换为二进制数

 十进制 --> 二进制   100 --> 1100100   
 100 / 2   = 50  	0   
 50  / 2   = 25     0   
 25  / 2   = 12     1   
 12  / 2   = 6      0   
 6   / 2   = 3      0   
 3   / 2   = 1      1   
 1   / 2   = 0      1

二进制转十进制

每一位二进制进制位的值 * 2的当前索引次幂; 再将所有位求出的值相加

例如: 将二进制01100100转换为十进制

01100100

索引从右至左, 从零开始
第0: 0 * 2^0 = 0;1: 0 * 2^1 = 0;2: 1 * 2^2 = 4;3: 0 * 2^3 = 0;4: 0 * 2^4 = 0;5: 1 * 2^5 = 32;6: 1 * 2^6 = 64;7: 0 * 2^7 = 0;
最终结果为: 0 + 0 + 4 + 0 + 0 + 32 + 64 + 0 = 100

二进制转八进制

三个二进制位代表一个八进制位, 因为3个二进制位的最大值是7,而八进制是逢8进1

例如: 将二进制01100100转换为八进制数

从右至左每3位划分为8进制的1, 不够前面补0
-->001 100 1000: 100 等于十进制 41: 100 等于十进制 42: 001 等于十进制 1
最终结果:144就是转换为8进制的值

二进制转十六进制

四个二进制位代表一个十六进制位,因为4个二进制位的最大值是15,而十六进制是逢16进1

例如: 将二进制01100100转换为十六进制数

从右至左每4位划分为16进制的1, 不够前面补0
-->0110 01000: 0100 等于十进制 41: 0110 等于十进制 6
最终结果:64就是转换为16进制的值

其它进制转换为十进制

系数 * 基数 ^ 索引 之和

例如:

十进制-->十进制   12345 = 10000 + 2000 + 300 + 40 + 5           = (1 * 10 ^ 4)  
+ (2 * 10 ^ 3) 
+ (3 * 10 ^ 2) 
+ (4 * 10 ^ 1) 
+ (5 * 10 ^ 0)           
= (1 * 10000) 
+ (2 + 1000) 
+ (3 * 100) 
+ (4 * 10) 
+ (5 * 1)           
+ =  10000 + 2000 + 300 + 40 + 5 =  12345   

规律: 其它进制转换为十进制的结果 = 系数 * 基数 ^ 索引 之和
系数: 每一位的值就是一个系数
基数: 从x进制转换到十进制, 那么x就是基数
索引: 从最低位以0开始, 递增的数

十进制快速转换为其它进制

十进制除以 基数 取余, 倒叙读取

 十进制 --> 二进制   100 --> 1100100   
 100 / 2   = 50  	0   
 50  / 2   = 25     0   
 25  / 2   = 12     1   
 12  / 2   = 6      0   
 6   / 2   = 3      0   
 3   / 2   = 1      1   
 1   / 2   = 0      1         
 十进制  --> 八进制   100 -->  144   
 100 / 8    = 12    4   
 12  / 8    = 1     4   
 1   / 8    = 0     1      
 十进制 --> 十六进制 	100 --> 64   
 100 / 16   =  6    4   
 6   / 16   =  0    6

十进制小数转换为二进制小数

1、整数部分,直接转换为二进制即可
2、小数部分,使用"乘2取整,顺序排列"
3、用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,直到积中的小数部分为零,或者达到所要求的精度为止
4、然后把取出的整数部分按顺序排列起来, 即是小数部分二进制
5、最后将整数部分的二进制和小数部分的二进制合并起来, 即是一个二进制小数

例如: 将12.125转换为二进制

// 整数部分(除2取余) 
12/ 2------   6   // 余0
6/ 2------   3   // 余0
3/ 2------   1  // 余1
1/ 2------ 0   // 余1
12 --> 1100 
// 小数部分(乘2取整数积) 
0.125*     2 ------   0.25 //0   
0.25*     2 ------   0.5 //0   
0.5*     2 ------   1.0 //1   
0.0--> 0.125 --> 0.001
12.8125 --> 1100.001

二进制小数转换为十进制小数

1、整数部分按照二进制转十进制即可
2、小数部分从最高位开始乘以2的负n次方, n从1开始

例如: 将 1100.001转换为十进制

// 整数部分(乘以2的n次方, n从0开始)
0 * 2^0 = 0
0 * 2^1 = 0
1 * 2^2 = 4
1 * 2^3 = 8  
1100 == 8 + 4 + 0 + 0 == 12
// 小数部分(乘以2的负n次方, n从0开始)
0 * (1/2) = 0
0 * (1/4) = 0
1 * (1/8) = 0.125
.001 == 0 + 0 + 0.125 == 0.125 
1100.001 --> 12.125

原码反码补码

计算机只能识别0和1, 所以计算机中存储的数据都是以0和1的形式存储的
数据在计算机内部是以补码的形式储存的, 所有数据的运算都是以补码进行的

正数的原码、反码和补码

正数的原码、反码和补码都是它的二进制
例如: 12的原码、反码和补码分别为

原码:0000 0000 0000 0000 0000 0000 0000 1100
反码:0000 0000 0000 0000 0000 0000 0000 1100
补码:0000 0000 0000 0000 0000 0000 0000 1100

负数的原码、反码和补码

1、二进制的最高位我们称之为符号位, 最高位是0代表是一个正数, 最高位是1代表是一个负数
2、一个负数的原码, 是将该负数的二进制最高位变为1
3、一个负数的反码, 是将该数的原码 除了符号位 以外的其它位取反
4、一个负数的补码, 就是它的反码 + 1

例如: -12的原码、反码和补码分别为

0000 0000 0000 0000 0000 0000 0000 1100 // 12二进制
1000 0000 0000 0000 0000 0000 0000 1100 // -12原码 
1111 1111 1111 1111 1111 1111 1111 0011 // -12反码 
1111 1111 1111 1111 1111 1111 1111 0100 // -12补码

负数的原码、反码和补码逆向转换

1、反码 = 补码-1
2、原码= 反码最高位不变, 其它位取反

1111 1111 1111 1111 1111 1111 1111 0100 // -12补码 
1111 1111 1111 1111 1111 1111 1111 0011 // -12反码 
1000 0000 0000 0000 0000 0000 0000 1100 // -12原码

为什么要引入反码和补码

计算机只能做加法运算, 不能做减法和乘除法, 所
以的减法和乘除法内部都是用加法来实现的
例如: 1 - 1, 内部其实就是 1 + (-1);
例如: 3 * 3, 内部其实就是 3 + 3 + 3;
例如: 9 / 3, 内部其实就是 9 + (-3) + (-3) + (-3);
首先我们先来观察一下,如果只有原码会存储什么问题
很明显, 通过我们的观察, 如果只有原码, 1-1的结果不对

 // 1 + 1   
 0000 0000 0000 0000 0000 0000 0000 0001 //1原码 
 +0000 0000 0000 0000 0000 0000 0000 0001 // 1原码   
 --------------------------------
 0000 0000 0000 0000 0000 0000 0000 0010 == 2   
 // 1 - 1; 
 //1 + (-1); 
 0000 0000 0000 0000 0000 0000 0000 0001 // 1原码 
 +1000 0000 0000 0000 0000 0000 0000 0001 // -1原码  
  ------------------------------------
 1000 0000 0000 0000 0000 0000 0000 0010 == -2

正是因为对于减法来说,如果使用原码结果是不正确的, 所以才引入了反码

1、通过反码计算减法的结果, 得到的也是一个反码;
2、将计算的结果符号位不变其余位取反,就得到了计算结果的原码
3、通过对原码的转换, 很明显我们计算的结果是-0, 符合我们的预期

// 1 - 1; 1 + (-1); 
0000 0000 0000 0000 0000 0000 0000 0001    // 1反码 
1111 1111 1111 1111 1111 1111 1111 1110   // -1反码 
--------------------------------------- 
1111 1111 1111 1111 1111 1111 1111 1111 // 计算结果反码 
1000 0000 0000 0000 0000 0000 0000 0000 // 计算结果原码 == -0

虽然反码能够满足我们的需求, 但是对于0来说, 前面的负号没有任何意义, 所以才引入了补码

由于int只能存储4个字节, 也就是32位数据, 而计算的结果又33位, 所以最高位溢出了,符号位
变成了0, 所以最终得到的结果是0

 // 1 - 1; 1 + (-1);
  0000 0000 0000 0000 0000 0000 0000 0001 // 1补码
  1111 1111 1111 1111 1111 1111 1111 1111   // -1补码
  ---------------------------------------
 10000 0000 0000 0000 0000 0000 0000 0000 // 计算结果补码
  0000 0000 0000 0000 0000 0000 0000 0000 // == 0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值