分类
Level7

进制转换

10进制 数字表达时, 每个位置就有了不同的含义,可以看作下边的公式。e 是小数点后开始的数位。可以表示成: a×103+b×102+c×101+d×100+e×10-1+f×10-2+g×10-3

a,b,c … 代表0 – 9中的任意一个符号,现在的数量是 a个1000,b 个 100,c 个 10……

比如2021.724就可以看成下边的样子:2×103+0×102+2×101+1×100+7×10-1+2×10-2+4×10-3

二进制 是计算机内部运算中采用的进制,在这样的进制系统下,只有两个数字(0和1),计算机内部的所有运算(包括位运算)都是在二进制的基础上进行的。

但用二进制表示数字会让数字过长,因此为了方便表示的需要,通常会把二进制数转换为八进制或十六进制表示。

二进制形式:a×23+b×22+c×21+d×20+e×2-1+f×2-2+g×2-3

二进制中只有两个符号 0 和 1 可以用,满 2 就要进 1。

八进制 在八进制下,有八个数字0~7。一般,八进制数以0xx的形式来表示,其中0为八进制的前缀, xx 代表八进制数。一位八进制数可以表示 3 位二进制数

十六进制 在十六进制下,有0,1,2,3,4,5,6,7,8,9,A(10),B(11),C(12),D(13),E(14),F(15) 十六个数字。十六进制数以 0xdbf (其中 0x 为十六进制数的前缀)的形式来表示。

十六进制与二进制相比,最大的优点就是表示的数字长度较短,一位十六进制数可以表示 4 位二进制数

二进制/八进制/十六进制/等其他进制 转 10进制 按权展开

十进制转二进制/八进制/十六进制 以二进制为例来演示,其他进制的原理与其类似。整数部分使用短除法,把十进制数不断执行除 2 操作,直至商数为 0。读余数从下读到上,即是二进制的整数部分数字。小数部分乘2取整,则用其乘 2,取其整数部分的结果,再用计算后的小数部分依此重复计算,算到小数部分全为 0 为止,之后从上到下,读所有计算后整数部分的数字,即为二进制的小数部分数字。

将33.25转化为二进制数

整数部分:
33/2=16 ......1
16/2=8 ......0
8/2=4 ......0
4/2=2 ......0
2/2=1 ......0
1/2=0 ......1

小数部分:

0.25*2=0.5 0
0.5*2 =1 1

159 转成 8进制:

二进制/八进制/十六进制转十进制

以二进制为例 二进制数转换为十进制数,只需将每个位的值,乘以 2i 次即可,其中 i 为当前位的位数,个位的位数为 0。

将(11010.01)2转换为十进制数

(11010.01)2=1×24+1×23+0×22+1×21+0×20+0×2-1+1×2-2=(26.25)10

二进制/八进制/十六进制间的相互转换

一个八进制位可以用 3 个二进制位来表示(因为 23=8 ),一个十六进制位可以用 4 个二进制位来表示( 24=16 ),反之同理。

2进制4进制8进制16进制
0000000
0001111
0010222
0011333
01001044
01011155
01101266
01111377
100020108
100121119
10102212A
10112313B
11003014C
11013115D
11103216E
11113317F

例题 下列四个不同进制的数中,与其它三项数值上不相等的是( )。

A.(269)16
B.(617)10
C.(1151)8
D.(1001101011)2

解析:转成10进制比较,计算量比较大。有8进制和16进制,可以直接转成二进制。二进制转八进制是3个并1个、转十六进制是4个并1个。

对D的二进制数分析:

(269)16 = (0010  0110  1001)2

(1151)8 = (001 001  101  001)2

D选项   (10    0110  1011)2 ; 显然,D 与 A C不符。

进制表示

  1. C 和 C++ 都没有提供二进制数的表达方法。
  2. C, C++ 规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。

int a = 0123; //表示8进制的123

这就是八进制数在C、C++中的表达方法。但是有一个例外就是转意符”。

因为C,C++规定不允许使用斜杠加10进制数来表示字符,所以 :

‘?’ //ASCII值是63

‘\077’ //是8进制表示’?’,0可以省略,因为C,C++规定不允许使用斜杠加10进制数来表示字符

‘\0x3F’ //是16进制表示’?’

  1. C,C++规定,16进制数必须以 0x 开头

int a = 0x15A //表示16进制的15A

其中的x不区分大小写。(注意:0x中的0是数字0,而不是字母o)。

  1. scanf/printf 使用’%o’ 和 ‘%x’读取和输出 8 进制和 16进制
#include<bits/stdc++.h>
using namespace std;
int main(){
    int a = 0123;
    int b = 0x123;
    printf("a8: %o a16:%x a10: %d\n",a,a,a);
    printf("a8: %o a16:%x a10: %d\n",b,b,b);

    scanf("%o %x",&a,&b);
    printf("%d %d\n",a,b);

    char str[100];
    sprintf(str, "%x",a);
    printf("%s\n", str);

    return 0;
}