二进制、八进制、十进制、十六进制之间的互相转换
一、其他进制转十进制
任何进制转换十进制都能按照权值展开计算,二进制的权值为2的n-1次方,n是当前位数,十六进制为16的n-1次方,依此类推,小数部分为2的-n次方,n是小数的位数,展开的时候从左向右,整数部分是从右向左
1010B = 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0 + 1 * 2^-1 + 0 * 2^-2 = 8 + 2 = 10
当前位数的值乘以当前位数的权值,然后累加起来就是最终的结果
十六进制八进制也是如此,比如
FFH = 15 * 16^1 + 15 * 16^0 = 240 + 15 = 255
如果是小数,小数部分第一位的权值就是2^-1,然后依次类推累加起来
1010.11B = 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0 + 1 * 2^-1 + 1 * 2^-2 = 8 + 2 + 0.5 + 0.25 = 10.75
二、十进制转其他进制
十进制转二进制,用十进制对二进制取余,除以二进制的基数,余数为转换后的结果,商是下一次被取余的数,直到商比基数小,比如123转二进制
123 / 2 = 61,余1 61 / 2 = 30,余1 30 / 2 = 15, 余0
15 / 2 = 7, 余1 7 / 2 = 3,余1 3 / 2 = 1,余1
剩下一个1就不用除了,直接放到结果里,要将余数倒着拼接起来,这个1就是最高位了
最终结果就是:1111011B
十进制转其他进制也是这样,只不过基数变了而已
如果是负数,那就先当作是正数,再转成二进制,然后再反码补码(在计算机里负数是需要以补码形式存放的)
-10 = 0000 1010B(原码) = 1111 0101B(反码) = 1111 0110B(补码)
//C语言输出:-10
char a = 0b11110110;
printf("%d\n", a);
三、二进制转十六进制
二进制转十六进制
每1位十六进制都对应着4位二进制,只要记住对应关系就可以了
0000B => 0H 0001B => 1H 0010B => 2H 0011B => 3H
0100B => 4H 0101B => 5H 0110B => 6H 0111B => 7H
1000B => 8H 1001B => 9H 1010B => AH 1011B => BH
1100B => CH 1101B => DH 1110B => EH 1111B => FH
1000 1010B
8 A 结果为8A