常用进制
十六进制是一种基数为 16 的计数系统,是一种逢 16 进 1 的进位制。通常用数字 0、1、2、3、4、5、6、7、8、9 和字母 A、B、C、D、E、F(a、b、c、d、e、f)表示,其中: A~F 表示 10~15,这些称作十六进制数字。十进制数是组成以10为基础的数字系统,有 0,1,2,3, 4, 5, 6, 7, 8, 9 十个基本数字组成。十进制,英文名称为 Decimal System,来源于希腊文 Decem,意为十。十进制计数是由印度教教徒在 1500 年前发明的,由阿拉伯人传承至 11 世纪。八进制,Octal,缩写 OCT 或 O,一种以 8 为基数的计数法,采用 0,1,2,3,4,5,6,7 八个数字,逢八进 1。一些编程语言中常常以数字 0 开始表明该数字是八进制。八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。二进制是计算技术中广泛采用的一种数制。 二进制数据是用 0 和 1 两个数码来表示的数。 它的基数为2,进位规则是"逢二进一",借位规则是"借一当二"。 二进制数(binaries)是逢2进位的进位制,0、1是基本算符 ;计算机运算基础采用二进制。
HEX,英文全称 Hexadecimal,表示十六进制。
DEC,英文全称 Decimal,表示十进制。
OCT,英文全称 Octal,表示八进制。
BIN,英文全称 Binary,表示二进制。
cin的进制选择
利用前文提及的英文缩写,我们很方便的按进制输入,其中按十进制输入时,“dec”这个前缀是可以省略的:
//输入一个八进制数
int x;
cin>>oct>>x;
//输入一个十进制数
int y;
cin>>dec>>y;
//输入一个十六进制数
int z;
cin>>hex>>z;
直接利用cout输出值到屏幕时,如果按八进制输入x为“77”,cout的输出值为“7x8+7=63”,因为cout的默认输出也是按照10进制,所以想要输出不同进制的数,也需要添加前缀:
//输入一个八进制数
int x;
cin >> oct >> x;
cout << oct << x;
//输入一个十进制数
int y;
cin >> dec >> y;
cout << dec << x;
//输入一个十六进制数
int z;
cin >> hex >> z;
cout << hex << x;
bitset库与二进制
bitset是C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。bitset除了可以访问指定下标的bit位以外,还可以把它们作为一个整数来进行某些统计。可以如下声明一个该类型变量:
bitset<N>varm (M)
其中varm为变量名;N表示该类型在内存中占的位数,是二进制;M表示变量varm的初始值。下面的代码展示了如何按2进制输入一个数字,并分别以2进制与10进制输出到屏幕:
#include <iostream>
#include<bitset>
using namespace std;
int main(){
bitset<16> sint;
cin >> sint;
cout << sint << endl;
cout << sint.to_ulong() << endl;
}
常用进制转换方法汇总表
原进制 | 目标进制 | 方法1 | 方法2 | 方法3 |
---|---|---|---|---|
十进制 | 二进制 | bitset指定格式输出 | 除留余数法 | itoa |
十进制 | 八进制 | oct/%o指定格式输出 | 除留余数法 | itoa |
十进制 | 十六进制 | hex/%x指定格式输出 | 除留余数法 | itoa |
二进制 | 十进制 | 按权展开 | strtol | |
八进制 | 十进制 | 按权展开 | strtol | |
十六进制 | 十进制 | 按权展开 | strtol | |
二进制 | 八进制 | 三位一组 | ||
二进制 | 十六进制 | 四位一组 | ||
八进制 | 二进制 | 一位换三 | 除留余数法 | |
八进制 | 十六进制 | |||
十六进制 | 二进制 | 一位换四 | 除留余数法 | |
十六进制 | 八进制 |
除留余数法
按权展开
比如将上面的二进制数“1011001”展开为10进制数:
$$1*2^6+0*2^5+1*2^4+1*2^3+0*2^2+0*2^1+1*2^0=89$$
小数的进制
10进制纯小数转2进制小数的方法,就是对小数部分乘二之后,对整数位取整。整数位为0就是零,为1就是1,然后整数位归零。重复这个过程。事实上,对于其他进制,这个方法也同样有效,比如下面这道题目:
与十进制数 28.5625 相等的四进制数是( )。
A. 123.21
B. 131.22
C. 130.22
D. 130.21
小数部分先乘以4,得2.25,记录整数部分的值2
,继续用小数部分乘以4,得到1
,也就意味着,10进制下0.5625的值在4进制下可以表示为0.21。