进制转化包括这篇我写了三篇了,这篇没讲的好多要点都在其他两篇讲到了大家有需要请点击下面链接跳转去学习
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
输入包含一个非负整数a,表示要转换的数。0<=a<=
输出这个整数的16进制表示
输入格式,数据类型一直是很重要的问题
输入格式这里是0<=a<=
,这里不是瞎写的,是java的int所能表示的最大的数,所以我们在本题还是可以继续用in
来表示a,但是如果出题人鬼一点,这里不是 7 而是
8,那我们就得用long
了
这道题本意是让我们一步步取模来完成,但是我们能使用java自带的一些包和方法来很简单的完成,如果平时练习建议两种都会,但是比赛或考试怎样简单怎么来吧
double
型,例如下面代码:
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含break语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
如果 case 语句块中没有 break 语句时,JVM 并不会顺序输出每一个 case 对应的返回值,而是继续匹配,匹配不成功则返回默认 case
十六进制(英文名称:Hexadecimal),是计算机中数据的一种表示方法。同我们日常生活中的表示法不一样。它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0~(N-1)的数表示,超过9的用字母A-F。
1、BCD码与十进制数的转换
BCD码与十进制数的转换关系很直观,相互转换也很简单,将十进制数75.4转换为BCD码:7-》0111,5-》0101,4-》0100所以拼成8421BCD码的结果是:(00)BCD;若将BCD码01转换为十进制数:1000-》8,0101-》5,0101-》5所以结果是:(85.5)D。
注意:同一个8位二进制代码表示的数,当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数时,数值是不相同的。
例如:,当把它视为二进制数时,其值为24;但作为2位BCD码时, 其值为18。
又例如,如将其视为二进制数,其值为28,但不能当成BCD码,因为在8421BCD码中,它是个非法编码 。
计算机中的BCD码,经常使用的有两种格式,即分离BCD码,组合BCD码。
所谓分离BCD码,即用一个字节的低四位编码表示十进制数的一位,例如数82的存放格式为:
组合BCD码,是将两位十进制数,存放在一个字节中,例82的存放格式是
3、BCD码的加减运算
由于编码是将每个十进制数用一组4位二进制数来表示,因此,若将这种BCD码直接交计算机去运算,由于
计算机总是把数当作二进制数来运算,所以结果可能会出错。例:用BCD码求38+49。
解决的办法是对二进制加法运算的结果采用“加6修正,这种修正称为BCD调整。即将二进制加法运算的结果修正为BCD码加法运算的结果,两个两位BCD数相加时,对二进制加法运算结果采用修正规则进行修正。修正规则:
(1)如果任何两个对应位BCD数相加的结果向高一位无进位,若得到的结果小于或等于9,则该位不需修正;若得到的结果大于9且小于16时,该位进行加6修正。
(2)如果任何两个对应位BCD数相加的结果向高一位有进位时(即结果大于或等于16,注意不是修正时的进位),该位进行加6修正。
(3)低位修正结果使高位大于9时,高位进行加6修正。
下面通过例题验证上述规则的正确性。
注意:并没有满足上述3条规则,同时也没有满足上述3条规则,所以结果不作处理。
+(低位00-》12》9所以需要调整)
注意:在给低位加0110调整时也有向高位进位发生,但是这是在调整时的进位,故不做处理。
+(低位相加时有进位发生,所以需要给低位加0110-》调整)
注意调整后的结果也不满足上述(3)的条件所以不再调整
注意结果不满足(3)条件所以不再调整。
0 +(有进位发生所以需要给相加结果调整)
注意结果不满足(3)条件所以不再调整。
+(由于结果的两位编码数满足上述条件1所以需要给10调整)
+(由于结果的高位1010-》10》9所以满足上述(3)条件给高位加0110调整)
注意:对于调整我们只需要关心结果是不是满足上述(3)条件,不满足不予调整。
+(注意这里和都满足上述(1)条件所以需要都调整)
注意结果满足上述(3)条件所以不再调整。(例子补充于)
两个组合BCD码进行减法运算时,当低位向高位有借位时,由于”借一作十六“与”借一作十“的差别,将比正确的结果多6,所以有借位时,可采用”减6修正法“来修正。两个BCD码进行加减时,先按二进制加减指令进行运算,再对结果用BCD调整指令进行调整,就可得到正确的十进制运算结果。 实际上,计算机中既有组合BCD数的调整指令,也有分离BCD数的调整指令。另外,BCD码的加减运算,也可以在运算前由程序先变换成二进制数,然后由计算机对二进制数运算处理,运算以后再将二进制数结果由程序转换为BCD码。
16进制数转换成8421BCD编码函数
_List_8421_Data: //16进位数转换成8421码的位权表,万位每千位进位,千位每百位进位,百位每十位进位
//描述:16进位数转换成8421码,存放在C段中定义好的数组当中
//须定义一个下标8位的整数数组,C段中如下书写
//参数:被转换数小于0xFFFF的数,符号标记0或非零的数
r3=[bp+4]; //符号位标志,为0,则做无符号整数处理,非1做有符号数处理
test R3,0xFFFF; //检查R3是否非0,如果非零,做有符号数处理,如果为0,做无符号数处理
[R4]=r3; //表的第1个单元高4字节存放符号标记,F为负,0为正
R2=0X0007; //R2为进位标志,从9到1循环,R2初置7,进入循环后减1为6做初值
BP+=0X0001; //基址加1,定位到位权表第一个有效数字
R2-=0X0001; //位权减1,准备输出位权表第一个有效数字所对应的位数字
cmp r1,[bp]; //比较被转换数和当前位权的大小
R3=R4+1; //包括下3步,输出10进制第5位,被转换数减位权,做被转换数,跳到“_hex_loop1”,继续比较
R3=R4+2; //包括下3步,输出10进制第4位,被转换数减位权,做被转换数,跳到“_hex_loop1”,继续比较
R3=R4+3; //包括下3步,输出10进制第3位,被转换数减位权,做被转换数,跳到“_hex_loop1”,继续比较
R3=R4+4; //包括下3步,输出10进制第2位,被转换数减位权,做被转换数,跳到“_hex_loop1”,继续比较
十六进制(英文名称:Hexadecimal),是计算机中数据的一种表示方法。同我们日常生活中的表示法不一样。它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;A-F对应10-15;N进制的数可以用0~(N-1)的数表示,超过9的用字母A-F。
定义:计算机中数据的一种表示方法
十六进制的表示方法:十六进制照样采用位置计数法,位权是16为底的幂。对于n位整数,m位小数的十六进制数用加权系数的形式表示如下:
10进制的32表示成16进制就是:20
十进制数可以转换成十六进制数的方法是:十进制数的整数部分“除以16取余”,十进制数的小数部分“乘16取整”,进行转换。
比如说十进制的0.1转换成八进制为0.4631。就是0.1乘以8=0.8,不足1不取整,0.8乘以8=6.4,取整数6, 0.4乘以8=3.2,取整数3,依次下算。
编程中,我们常用的还是10进制.毕竟C/C++是高级语言。比如:
不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。但二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:
面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?2、8、16,分别是2的1次方、3次方、4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。在下面的关于进制转换的课程中,你可以发现这一点。
二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……
所以,设有一个二进制数:,转换为10进制为:356
0乘以多少都是0,所以我们也可以直接跳过值为0的位:
八进制数采用 0~7这八数来表达一个数。
八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……
所以,设有一个八进制数:1507,转换为十进制为:839,具体方法如下:
16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这六个字母来分别表示10,11,12,13,14,15。字母不区分大小写。
十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……
所以,在第N(N从0开始)位上,如果是数β (β大于等于0,并且β小于等于 15,即:F)表示的大小为 β×16的N次方。
假设有一个十六进数 2AF5
此处可以看出,所有进制换算成10进制,关键在于各自的权值不同。
假设有人问你,十进数1234 为什么是一千二百三十四?你尽可以给他这么一个算式:
首先我们来看一个二进制数:1111,它是多少呢?
然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为23=8,然后依次是 22=4,21=2,20=1。
记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。
下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)
仅4位的2进制数 快速计算方法 十进制值 十六进制
二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。
如(上行为二制数,下面为对应的十六进制):
反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?
看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。
所以,FD转换为二进制数,为:
由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。
比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:
被除数 计算过程 商 余数
结果16进制为:4D2
然后我们可直接写出4D2的二进制形式:
同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。
下面举例一个int类型的二进制数:
采余数定理分解,例如将487710转成十六进制:
如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数:9876,就看不出它是16进制或10进制。
C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也不区分大小写。(注意:0x中的0是数字0,而不是字母O)
至此,我们学完了所有进制:10进制,8进制,16进制数的表达方式。最后一点很重要,C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能表达无符号的正整数,如果你在代码中写:-078,或者写:-0xF2,C,C++并不把它当成一个负数。
转义符也可以接一个16进制数来表示一个字符。如 \'?\' 字符,可以有以下表达方式:
\'\77\' //用八进制,此时可以省略开头的0
同样,这一小节只用于了解。除了空字符用八进制数 \'\0\' 表示以外,我们很少用后两种方法表示一个字符。