028 十六进制和八进制
主要内容
1.十六进制和十进制转换
首先,还是在,十进制数中,我们有这样的约定:
千 百 十 个
1 2 3 4
现在我们来看一下,十六进制该怎么转化。
1.1 十六进制 to 十进制
在之前的课程中,我们已经介绍过了。这里复习一下。
假设有一个十六进制,
5AF1
然后我们可以这样约定,在十六进制中:(* 大师码老师,请根据情况,适当补充指数等相关知识。)
(16^3) (16^2) (16^1) (16^0)
5 A F 1
如何计算它的十进制值呢?
从个位开始:
(16^0): 1 * (16^0) = 1 * 1 = 1
(16^1): F * (16^1) = 15 * 16 = 240
(16^2): A * (16^2) = 10 * 16*16 = 2560
(16^3): 5 * (16^3) = 5 * 16*16*16 = 20480
所以,总和为:20480 + 2560 + 240 + 1 = 23281
请计算下面几个十六进制数的十进制值是多少。
注意,请写出计算过程。
FFFF
FF00
10
100
1000
ABCD
答案:
65535
255
16
256
4096
43981
3.2 十进制 to 十六进制
需要使用“倒除法”,被除数是 16
假设有一个十进制数:23281
_1455__
16)23281 // 商 1455 ,余数 1
23280
---------
1
取上一步计算得到的“商”,继续做除法。
___90_
16)1455 // 商 90 ,余数 15 (F)
1440
---------
15
取上一步计算得到的“商”,继续做除法。
__5__
16)90 // 商 5 ,余数 10(A)
80
---------
10
不能再除。
先写最后一步的“商”。
然后,倒着将所有余数写出来。(先写最底下的余数)
5AF1
这个方法,请多加练习。
2. 二进制和十六进制转换
二进制对于编程来说,是非常重要的。虽然我们还没有具体介绍原因,但是已经无数次的再强调了。
不过,二进制有一个显而易见的缺点,那就是太长长长。。。
1000 // 十进制 8
1111 1111 // 十进制 255
但是二进制太重要了,我们不能不使用它。所以,我们为了表示方便,就经常使用十六进制。
原因也是非常显而易见的,我们这儿,举几个例子,大家以看就明白了。
0001 // 十六进制 1
0010 // 十六进制 2
0100 // 十六进制 4
1000 // 十六进制 8
1111 // 十六进制 F
1111 1111 // 十六进制 FF
1111 1111 0000 0001 // 十六进制 FF01
因为二进制对程序而言非常重要,而十六进制沾了二进制的光,所以在编程中,也应用广泛。
- 4 位二进制,正好对应 1 位十六进制
2.1 二进制 to 十六进制
一般来说,我们可以通过十进制数作为媒介,完成它们之间的互转。
2.2 十六进制 to 二进制
一般来说,我们可以通过十进制数作为媒介,完成它们之间的互转。
在这里,请大家一定要记住:
1111 // 十六进制 F
这是非常重要的,要记得非常牢。
3. 二进制,八进制和十六进制,在 C++ 中的写法
虽然我们一直说,二进制很重要,但是
- C++ 中,没有二进制数的直接表示方法!!!
- 二进制数,是通过十六进制数,表示的!
请看代码:
int dashima;
dashima = 0xFF01; // 将 dashima 赋值为 0xFF01,这是十六进制数
dashima = 0x1; // 以 0x 开始,表示为十六进制
dashima = 0x0011; // 可以以 0 开头
dashima = 23281; // 将 dashima 赋值为 23281,这是十进制数
dashima = o1; // 将 dashima 赋值为 01,这是八进制数
dashima = o452; // 以 o 开始,表示为八进制。注意,这是字母 o,不是数字 0
dashima = o77;
- 0x 是十六进制数的开头。x 也可以大写,一般习惯小习。
- o 是八进制数的开头。注意,这不是数字0,这是字母o,也可以大写。
- C++ 中,十六进制的负数,非常特殊。不可以写作 -0xFF ,要使用反码,我们将在后面的课程中介绍。
习题
请练习一下,完成下面转化。注意书写计算过程。
1111(2进制) ==> 0x????
1100(2进制) ==> 0x????
1111 1100(2进制) ==> 0x????
1001 1101(2进制) ==> 0x????
0x0077 ==> ????(2进制)
0x00e8 ==> ????(2进制) // C++ 的十六进制写法中,不区分字母的大小写
0x7a5d ==> ????(2进制)
答案:
课堂练习答案见页面最下方

0x00e8 ==> 1110 1000
0x7a5d ==> 0111 1010 0101 1101