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进制 |
---|---|---|---|
0000 | 0 | 0 | 0 |
0001 | 1 | 1 | 1 |
0010 | 2 | 2 | 2 |
0011 | 3 | 3 | 3 |
0100 | 10 | 4 | 4 |
0101 | 11 | 5 | 5 |
0110 | 12 | 6 | 6 |
0111 | 13 | 7 | 7 |
1000 | 20 | 10 | 8 |
1001 | 21 | 11 | 9 |
1010 | 22 | 12 | A |
1011 | 23 | 13 | B |
1100 | 30 | 14 | C |
1101 | 31 | 15 | D |
1110 | 32 | 16 | E |
1111 | 33 | 17 | F |
例题 下列四个不同进制的数中,与其它三项数值上不相等的是( )。
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不符。
进制表示
- C 和 C++ 都没有提供二进制数的表达方法。
- 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进制表示’?’
- C,C++规定,16进制数必须以 0x 开头
int a = 0x15A
//表示16进制的15A
其中的x不区分大小写。(注意:0x中的0是数字0,而不是字母o)。
- 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;
}