各种信息进入计算机,都要转换成"0"和"1"的二进制形式。
计算机 采用二进制的原因是:
- 物理上容易实现,可靠性高。(电子元件的通电和不通电就可以表示1和0,所以非常方便)
- 运算简单,通用性强。
- 便于表示和进行逻辑运算。
进位计数制的特点:
采用进位的方式进行计数;
使用位置表示法
例如:
表 2-1 计算机中常用的数字系统 进制
二进制
十进制
八进制
|------|------|--------------|--------------|--------------------------|
| 进制 | 二进制 | 十进制 | 八进制 | 十六进制 |
| 进位规则 | 逢二进一 | 逢十进一 | 逢八进一 | 逢十六进一 |
| 基数 | 2 | 10 | 8 | 16 |
| 基本符号 | 0,1 | 0,1,2, ...,9 | 0,1,2, ...,7 | 0,1,2, ...,9,A,B,C,D,E,F |
十进制转换成二进制123.45转1111011.011100
计算机种如何表示呢?
在C++中,你可以使用
进制表示
-
二进制 (
0b
或0B
前缀): 从C++11开始,你可以使用前缀0b
或0B
来表示二进制数。cppint num = 0b1011; // 等同于十进制中的11
-
八进制 (
0
前缀): 八进制数可以通过在数字前添加0
来表示。cppint num = 011; // 等同于十进制中的9
3.十进制: 没有特殊前缀,默认就是十进制。
cpp
int num = 11; // 直接写数字
4.十六进制 (0x
或 0X
前缀): 十六进制数通过前缀0x
或0X
来表示。
cpp
int num = 0xB; // 等同于十进制中的11
输出进制转换
你可以使用std::cout
结合std::dec
, std::hex
, std::oct
和std::bitset
来输出不同进制的数字。
-
十进制 (
std::dec
):cppstd::cout << std::dec << num; // 输出十进制形式
-
十六进制 (
std::hex
):cppstd::cout << std::hex << num; // 输出十六进制形式
-
八进制 (
std::oct
):cppstd::cout << std::oct << num; // 输出八进制形式
-
二进制 (
std::bitset
):std::bitset
可以用来输出二进制字符串。cppstd::bitset<32> bits(num); std::cout << bits << '\n'; // 输出二进制形式
输入进制转换
使用std::cin
读取数字时,你可以指定进制,例如:
cpp
int num;
std::cin >> std::hex >> num; // 假设用户输入十六进制数字
各个进制:
cpp
#include <iostream>
#include <bitset>
int main() {
int num = 27;
std::cout << "Decimal: " << num << '\n';
std::cout << "Binary: " << std::bitset<32>(num) << '\n';
std::cout << "Octal: " << std::oct << num << '\n';
std::cout << "Hexadecimal: " << std::hex << num << '\n';
return 0;
}
其它的转化公式和原理
1. 从十进制转换为其他进制
转换公式:
假设我们要将一个十进制数d转换为r进制:
- 将d除以r,得到商q和余数ri。
- 将商q再次除以r,直到商为0,每次都记录下余数。
- 最终的r进制数是由余数从最后一个(即最先产生的余数)到第一个(即最后产生的余数)逆序排列组成的。
示例:
将十进制数13转换为二进制:
- 13/2=6 余数1
- 6/2=3 余数0
- 3/2=1 余数1
- 1/2=0 余数1
最终的二进制数是1101。
从其他进制转换为十进制
转换公式:
示例:
将二进制数1101转换为十进制:
3. 从非十进制直接转换为非十进制
转换公式:
先将非十进制数转换为十进制,然后再将十进制数转换为所需的非十进制。
示例:
将八进制数52转换为十六进制:
总结:
- 任意进制到十进制:使用上述的公式,将每个位的值乘以基数的幂次,然后求和。
- 十进制到任意进制:使用除法取余数的方法,将商重复进行除法直到为0,然后倒序排列余数。
这些原理和公式适用于任何进制的转换,只要知道基数和位数权重,就可以进行有效的转换