【软件工程师学硬件】之 进制转换

为什么要说一下这个进制转换,原因是软件工程师基本上都和十进制打交道的比较多,对二进制了解得很少,但是,在硬件程序中,很多涉及到位运算以及逻辑分析,如果不清楚二进制,可能会比较茫然。但是这里尽量避免掉进理论中,那样,我们的工程师们会更茫然。
为了说明二进制,我们对比十进制来描述,可能就比较好理解一些。比如说十进制的1,用4位二进制来表示,就是0001,用8位二进制就是0000 0001,用16位二进制就是 0000 0000 0000 0001。如果是十进制3,用4位二进制表示就是 0011,如果是7呢?就是0111,如果是15,就是 1111。这个十进制位数不多,还好一些,如果是323呢?可能就比较费劲了。
为了找到一个捷径,我们先来看看十六进制和二进制的对应关系。
首先弄清楚一个基本知识,假如十六进制数为0x01,对应二进制就是0000 0001,假如十六进制数为0x02,则对应二进制数为0000 0002,大家有没有发现,假如我们将十六进制拆开成两部分,左边我们叫十六进制高位,右边我们叫十六进制低位,发现十六进制对应的二进制数正好是高位对应的二进制数与低位对应的二进制数拼起来的。再来看看0x23,按照上面的规律,应该0x02的二进制数和0x03的二进制数合在一起,注意不是加在一起。这样就会得到0x23的二进制数为0010 0011,大家自己验证一下。再来一个复杂一点的,比如十六进制数是0x143,这时候高位就成了0x14,低位就成了0x03,仍然将它们的二进制数合起来,结果是 0001 0100 0011,这时候,你会发现一个比较神奇的结果,就是16进制转二进制非常方便,只要写出每一位十六进制数对应的二进制数,然后合起来就成。再来一个复杂的验证一下,十六进制数0x2345,对应的二进制数为 0010 0011 0100 0101,完全正确!
可见这个十六进制和二进制真是难分难解,有着密切的关系,不然硬件编程也不会选用十六进制来替代二进制。
下面还是来说说十进制转二进制,毕竟我们还是对十进制有感觉,这里仍然要说一个小知识,假定十进制为23,那么我们要转换成16进制,一般的算法比较麻烦,我就不列举了,直接说一个简单的算法,我们把23除以16,得到一个商和余数,这个商就是这个被除数对应16进制的高位,余数对应的就是16进制的低位,同样将高低位合起来就是一个完整的16进制数。23除以16,得到商为1,余数为7,所以十进制数23对应的16进制数就是0x17。再举一个复杂一点的例子,十进制数248,商为15,余数为8,所以十六进制就是0xf8,注意,十六进制对应十进制的15是f,所以不能写成0x158,而是0xf8,你看十进制转十六进制是不是也很方便。
实际上十进制转二进制也可以这样做,还拿23为例,23除以2,商为11,余数为1,所以二进制数为 00010111,注意1是低位,直接合在高位后面。再看十进制248,248除以2,发现除三次余数都是0,所以最后三位都是0,第四次得商为15余1,所以二进制是15的二进制数1111合上余数1,再合上最后的三个0,就是11111000,规整一下就是 1111 1000,这种方法虽然能够算出来,但是感觉还不是很方便,所以我们要用十六进制做个中转。
看看十进制248,转成16进制就是0xf8,所以二进制就是1111 1000,注意1111就是十进制的15,1000就是十进制的8。
通过上面的例子发现,十进制的大数转成十六进制再转成二进制就比较舒服一点。
实际上,经常用到的十六进制数或者二进制数并没有那么巨大的,毕竟单片机也不能进行天文数字的处理,即使有的话,那就使用计算器或者自己用笔算一下,也不是很麻烦的事情。但是对于常用的比较小的整数,使用上面的方法还是比较实用的。
这里要提一句,常用的十进制0~9以及十六进制0~f对应的二进制数还是尽量要记住,这样在编码的时候就没必要再去用笔算这个简单的数了。
最后再说一句,在单片机编程中,有除法和模运算,除法取商,即得到高位,模运算取余,即得到低位。举个例子,23除以2,商为11,余数为1,就有下面的算式,23/2=11,23%2=1。在单片机编程中,经常有分离高低位的场合,一般的做法都是这样。

猜你喜欢

转载自blog.csdn.net/wwwmagic/article/details/91791424