半小时掌握进制转换
什么是进制转换
进制转换是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。位权是指,进位制中每一固定位置对应的单位值。
– 百度百科
进制转换的本质
进制的本质就是查表,与各种的转换没有任何关系,并不是说计算八进制,就把它转为十进制计算后再转回八进制,这种思想本来就是错误的,进制的本质就是写表和查表,我们之所以对十进制的特别熟悉,就是因为我们把十进制相关的表记住了,并不是因为十进制就是进制的基础。
常用的进制
十进制
简介
人类算数采用十进制,可能跟人类有十根手指有关。亚里士多德称人类普遍使用十进制,只不过是绝大多数人生来就有10根手指这样一个解剖学事实的结果。实际上,在古代世界独立开发的有文字的记数体系中,除了巴比伦文明的楔形数字为60进制,玛雅数字为20进制外,几乎全部为十进制。只不过,这些十进制记数体系并不是按位的。
计数方法
十进制计数法是相对二进制计数法而言的,是我们日常使用最多的计数方法(俗称“逢十进一”),它的定义是:“每相邻的两个计数单位之间的进率都为十”的计数法则,就叫做“十进制计数法”。
转换
十进制与二进制的相互转换
-
二进制转换十进制
由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。 例把二进制数110.11转换成十进制数。
首先将110转换为十进制数为:
0×20+1×21+1×22=6
再将0.11转换成十进制数为:
1×2-1+1×2-2=0.75
-
十进制转换二进制
整数部分:除二取余,逆序排列
小数部分:乘二取整,正序排列
例:6.75转换为二进制
整数部分
6/2=3…0
3/2=1…1
1/2=0…1
得:110
小数部分
0.75×2=1.5 1
0.5×2=1 1
得:11
最终结果:110.11
十进制与八进制的相互转换
与二进制类似不过多赘述
十进制与十六进制的相互转换
与二进制类似不过多赘述
八进制
简介
Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。
八进制(基数为8)表示法在计算机系统中很常见,因此,我们有时能看到人们使用八进制表示法。由于十六进制一位可以对应4位二进制数字,用十六进制来表示二进制较为方便。因此,八进制的应用不如十六进制。有一些程序设计语言提供了使用八进制符号来表示数字的能力,而且还是有一些比较古老的Unix应用在使用八进制。
计算机需要数制转换,计算机内部使用二进制,二进制八进制十进制之间的数制转换,FORTRAN77 编制, 围绕二进制与小数,完成二进制八进制十进制之间的数制转换。
转换
八进制二进制的相互转换
-
八进制转换为二进制
规则:按照顺序,每1位八进制数改写成等值的3位二进制数,次序不变。
例:056转换为二进制
101110
-
二进制转换为八进制
每三位为八进制的一位
例:101110转换为八进制
101…5
110…6
得56
八进制与十进制的相互转换
-
八进制转换为十进制
按权展开:
例:056转换为十进制
6×80+5×81=46
-
十进制转换为八进制
除八取余,逆序排列
例:46转换为八进制
46/8=5…6
5/8=0…5
得56
八进制与十六进制转换
将八进制转换为二进制或十进制再转换为十六进制
需要取中间进制进行过度
二进制
简介
二进制(binary)是在数学和数字电路中指以2为基数的记数系统,是以2为基数代表系统的二进位制。这一系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示 [1] 。数字电子电路中,逻辑门的实现直接应用了二进制,因此现代的计算机和依赖计算机的设备里都用到二进制。每个数字称为一个比特(Bit,Binary digit的缩写)
运算
加法
二进制加法有四种情况: 0+0=0,0+1=1,1+0=1,1+1=10(0 进位为1)
减法
二进制减法有四种情况:0-0=0,1-0=1,1-1=0,0-1=1
乘法
二进制乘法有四种情况: 0×0=0,1×0=0,0×1=0,1×1=1
除法
二进制除法有两种情况(除数只能为1):0÷1=0,1÷1=1
二进制与其他进制的转换
转换为十进制
按权展开求和
转换为八进制
每三位二进制为一个八进制数,每三位都按权展开求和。
转换为十六进制
每四位二进制为一个十六进制数,每四位都按权展开求和。
反码和补码
反码
反码就是在二进制的基础上每一位都取反
例:1001011的反码为0110100
补码
补码是在反码的基础上进行的加1操作
例:1001011的补码为?
先求反码:0110100
再求补码:0110101
十六进制
简介
十六进制(简写为hex或下标16)在数学中是一种逢16进1的进位制。一般用数字0到9和字母A到F(或af)表示,其中:AF表示10~15,这些称作十六进制数字。
表示方法
不同电脑系统、编程语言对于16进制数值有不同的表示方式:
- Ada与VHDL用所基于的“数字引证”把16进制数包起来,例如“16#5A3#”。(注:Ada对整数和实数都可以使用从1到16中任何一个做为其基数。)而对于字节向量,VHDL使用字首 x 表示,例如,x"10",对应的二进制码为:“00010000”。
- C语言、C++、Shell、Python、Java语言及其他相近的语言使用字首“0x”,例如“0x5A3”。开头的“0”令解析器更易辨认数,而“x”则代表十六进制(就如“O”代表八进制)。在“0x”中的“x”可以大写或小写。对于字符量C语言中则以x+两位十六进制数的方式表示,如xFF。
- 十六进制转义序列:如 \x1abf4 ,可以使用任意多的十六进制数字,直至不是十六进制数字为止;
- 16位的通用字符名(universe-character name):\u后面必须跟4个十六进制数字(不足四位前面用零补齐),表示Unicode中在0至0xFFFF之内的码位(但不能表示0xD800到0xDFFF之内的码点,Unicode标准规定这个范围内的码位保留,不表示字符);
- 32位的通用字符名:\U后面必须跟8个十六进制数字(不足八位前面用零补齐),表示Unicode中所有可能的码位(除0xD800到0xDFFF之外)。
- C++11引进了十六进制浮点型字面常量。例如:0x1.2p10表示 (1+2/16)×2=115210。实际上,Visual C++一直以来使用的C/C++语言标准库函数printf,%a作为类型说明符来格式化输出浮点型值即为上述格式。例如:printf("%a",1152.0);
- C/C++在表示字符型字面常量时,可以用:
- 在VB、MSX BASIC、Quick BASIC和FreeBASIC中,使用字首“&H”来表示。
- 在HTML,十六进制字元可以用“x”,例如֣和֣效果应该无异。
Intel的汇编语言中用字尾“h”来标识16进位的数(若该数以字母起首,在前面会增加一个“0”)例如“0A3Ch”、“5A3h”
其他汇编器(AT&T、Motorola、6502),Pascal,Delphi和某些BASIC的版本使用字首“$”,例如“$5A3”
亦有用X’5A3’这类表示方式的,如于PL/I,COBOL及JCL中。这亦是IBM装载早期操作系统的大型机与小型机上最常用的数据格式。 - 由于表示方式没有单一、已协定的标准,所以以上的表示方式都有被使用,有时甚至在同一份论文上会出现几个不同的表示方式。但因为各方式之间没有太大的分歧,所以即使混合使用也没有构成问题。
- 其中最常用(或常见)表示十六进制数值的方式是将 ‘0x’ 加在数字前,或在数字后加上小字 16。例如 0x2BAD 和 2BAD16都是表示十进制的11181(或1118110)。
- 在网页设计上十六进制是很常用的。HTML和CSS使用十六进制的表示法来表示网页上的特定颜色。使用 # 的符号来表示而非用个别的符号表示十六进制。24-bit 颜色可以用 #RRGGBB 的格式来表示,RR 是颜色中红色成分的数值,GG 是颜色中绿色成分的数值,BB 颜色中蓝色成分的数值。举个例子, 红色的阴影是十进制 238,9,63 可以编成 #EE093F。
表示方法表
此中hex带入具体16进制数.
环境 | 格式 | 备注 |
---|---|---|
URL | %hex | |
XML,XHTML | &#xhex | |
HTML,CSS | #hex | 6位,用于表示颜色 |
Unicode | U+hex | 6位,表示字符编码 |
MIME | =hex | |
Modula-2 | #hex | |
Smalltalk,AL GOL 68 | 16rhex | |
Common Lisp | #rhex或#16rhex | |
IPv6 | 8个hex用:分隔 |
十六进制的转换
十进制转十六进制
采用的余数定理分解
例:4877转换为16进制
4877/16=304…13
304/16=19…0
19/16=1…3
1/16=0…1
结果为:130D
C++实现十进制转换为k进制
#include <iostream>
using namespace std;
int main()
{
char a[1000];
int y = 0,k,n,x;
char z='A';
cin >> n >> x;
while(n!=0)
{
y++;
a[y]=n%x;
n=n/x;
if(a[y]>9) a[y]+=z-10;
else a[y]+='0';
}
for(int i = y; i > 0; i--)
cout << a[i];
return 0;
}
C++实现m进制转换为十进制
#include <iostream>
#include<cstring>
using namespace std;
char a[10000];
int main()
{
int n,m;
int f=0;
cin >> a >> m;
for(int i=0;i<strlen(a);i++)
{
f*=m;
if(a[i]=='A'||a[i]=='B'||a[i]=='C'||a[i]=='D'||a[i]=='E'||a[i]=='F')
f+=(a[i]-'A'+10);
else
f+=(a[i]-'0');
}
cout << f;
return 0;
}
部分内容来自于百度百科