1.3 二进制及其运算

课件 二进制及其运算

视频 二进制及其运算

计算机中所有的数据都是以二进制来表示的,单片机中的数据也是如此。

1.二进制、八进制、十六进制和十进制

组成计算机的电子元件通常有两种稳定状态,如电流的高或低、电路的导通或断开等,这两种状态由0和1来表示,就形成了二进制。所谓二进制是指由0和1两个数字构成的进制,每个数字的取值只能是0和1中的一个,要么是0要么是1,数值最大为1,超过1会产生进位。计算机中所有的数据或指令都是采用二进制来表示的。由于二进制中数字符号很少,当需要表达复杂的含义或是数据很大时,都需要增加二进制数的位数才行。但这样带来的后果是指令长度急剧增加,既不便于阅读也不便于记忆。因此人们又发明了八进制和十六进制来简化二进制的表达。八进制包含由0到7八个符号,十六进制包含由0到9再加上由A到F,共16个符号。这几种进制在日常生活中都不怎么使用,我们平时多使用的是十进制。

在一种进制表示当中,只能使用一组固定的数字符号来表示数目的大小,具体使用多少个符号,这个数量被称为数制的基数。如二进制中需要使用0和1两个符号,所以二进制的基数就是2。类似地十六进制需要使用0~9、A~F共16个符号,所以十六进制的基数就是16;八进制使用0~7共8个符号,其基数就为8;其余依此类推。一个符号处在数字中不同位置时所代表的值是不同的,这与人在不同的岗位就肩负不同的职责相似。每个符号所表示的数值等于该符号乘以一个与其所在位置相关的常数,这个常数就称为位权。位权值等于基数位置值。如十进制数123,基数为10,数字1所在位置编号是2,则它的位权是102=100;数字2所在位置编号是1,则它的位权是101=10;数字3的位置编号是0,则它的位权就是100=1。

常用进制信息及比较见表1-3。

表1-3 常用进制信息及比较

2.十进制转换为二进制

十进制是人们日常生活中使用的进制,而二进制是计算机中使用的进制,这二者之间需要进行转换,才能使计算机接受输入的数值。

十进制转换为二进制,需要对整数部分和小数部分分别转换,方法如下。

1)整数部分

十进制整数转换为二进制整数采用“除2取余”的方法,即用十进制整数除以2,计算每次得到的余数,直至最后商为0为止,再将各步得到的余数由后向前排列,就是转换得到的二进制数。

例:(15)D=(1111)B。

2)小数部分

十进制小数转换为二进制小数采用“乘2取整”的方法,即用十进制小数部分乘以2,计算每次得到的整数部分,直到达到计算精度为止。将各步得到的整数从前向后依次排列并加上小数点,即为转换后的二进制小数

例:(0.618)D=(0.1001)B。

对于带有小数的十进制数,进行二进制转换时,要对整数部分和小数部分分开进行转换,最后将整数部分与小数部分组合,即为转换后的二进制数。

3.二进制转换为十进制

二进制转换为十进制,是将计算机中的数据转换为人类可读的数据。与上面的介绍相同,也要对整数部分与小数部分分别进行转换。

1)整数部分

二进制整数转换为十进制可以用每一位二进制数乘以自己的位权后求代数和的方法来实现。

例:(101000101)B=(325)D。

1×28+0×27+1×26+0×25+0×24+0×23+1×22+0×21+1×20=256+64+4+1=325

2)小数部分

二进制小数转换为十进制也是用每一位二进制数乘以自己的位权后求代数和的方法来实现。但要注意,小数点后数字位权中的指数,是从小数点开始向后数,依次递减(即-1、-2、-3……)。

对于二进制数转换为十进制数也可以一次性完成。

例:(11.01011)B=(3.34375)D。

1×21+1×20+0×2-1+1×2-2+0×2-3+1×2-4+1×2-5=2+1+1/4+1/16+1/64=3.34375

4.二进制与其他进制之间的转换方法

1)二进制与八进制的转换

八进制和十六进制是人类为了简化二进制应用而提出来的进制方法。在计算机中只能识别二进制。

二进制转换为八进制的方法比较简单,可以将二进制数字从低位起,每3位分为一组,然后再将每组内的二进制数转换为八进制字符即可。

例:(1011001110)B=(1316)O。

将1011001110从右至左,每3位分成一组,即001|011|001|110,最前面一组不够3位时,可以用零补位。然后将各组二进制数按照上面转换为十进制整数的方法,各组分别转换,并将转换后得到的数字排列在一起,即为转换得到的八进制数。

要将八进制转换为二进制,同样只要将每一位八进制字符转换为与其等值的3位二进制数即可。

例:(2534)O=(10101011100)B。

将2534中的每个数字分别转换为3位二进制数(不足3位,在数字前面填零),然后再将结果组合起来,就是最终的结果。2转换为二进制为010,5转换为二进制为101,3转换为二进制为011,4转换为二进制为100。

2)二进制与十六进制的转换

二进制转换为十六进制的方法与二进制转换为八进制的方法类似,从低位开始,每4位分一组,然后将每组内的二进制数转换成十六进制数即可。

例:(1011001110)B=(2CE)H。

将1011001110从右至左,每4位分成一组,即0010|1100|1110,最前面一组不够4位时,可以用零补齐。然后将各组二进制数按照转换为十进制整数的方法,各组分别转换,并将转换后得到的数字排列在一起,即为转换得到的十六进制数。

要将十六进制转换为二进制,只需将对应的每一位十六进制字符转换为与其相等的4位二进制数即可。

例:(2534)H=(10010100110100)B。

将2534中的每个数字分别转换为4位二进制数(不足4位,在数字前面补零),然后再将结果组合起来,就是最终的结果。2转换为二进制为0010,5转换为二进制为0101,3转换为二进制为0011,4转换为二进制为0100。

5.二进制的位运算

课件 二进制位运算

视频 二进制位运算

位运算是指对构成二进制数字的每一位进行的运算。在单片机的控制中,经常会用到二进制的位运算。二进制的位运算主要有以下几种,如表1-4所示。

表1-4 二进制中常用的位运算

1)与运算

参与运算的两个二进制数的对应位进行与运算。其运算规则如下:

0&0=0 0&1=0 1&0=0 1&1=1

可归纳为:参与运算的两个数都为1,结果才为1,否则为0。换一个角度,也可以这样总结:任何数字(1或0)与0相与,结果一定是0;任何数字(1或0)与1相与,结果仍是原数字本身。

例:(10100110)B&(01100101)B=(00100100)B。

在单片机应用开发中,使用按位与运算可以达到某些特殊的效果,比如要将原数字中的某几位清0,只需让它与另外一个对应位为0其余位为1的数字按位与,即可达到这样的效果。如将110101中的第2位和第4位清0,其余位不变,则只需110101与101011相与即可。(注:说明第几位时,是从右边第0位数起的。)

2)或运算

或运算的运算规则如下:

0|0=0 0|1=1 1|0=1 1|1=1

可归纳为:参与或运算的两个数都为0,结果才为0,否则为1。换一个角度,也可以这样总结:任何数字(1或0)与0相或,结果仍是原数字本身;任何数字(1或0)与1相或,结果一定是1。

例:(10100110)B|(01100101)B=(11100111)B。

在单片机应用开发中,使用按位或运算可以达到将原数字的某几位置1其余位不变的效果。如将110101中的第1位置1其余位不变,则只需110101与000010按位或即可实现。

3)异或运算

异或运算的运算规则如下:

0^0=0 0^1=1 1^0=1 1^1=0

可归纳为:参与异或运算的两个数不同,结果就为1,否则就为0。换一个角度,也可以这样总结:任何数字(1或0)与0异或,结果仍是原数字本身;任何数字(1或0)与1异或,结果是原数字的翻转;

例:(10100110)B ^(01100101)B=(11000011)B。

在单片机应用开发中,使用异或运算可以将原数字中的某几位实现翻转的效果。如将110101中的低4位实现翻转,其余位不变,则只需110101与001111按位异或即可实现。

4)非运算

非运算又称取反运算,非运算只有一个运算对象。其运算规则如下:

~1=0 ~0=1

将某一个二进制数取反,只需要将对应位依次取反就可以了。

例:~(10100110)B=(01011001)B。

取反运算的优先级比较高,一般来讲有取反运算的要先取反运算。如~a&b,这里要先进行a的取反,然后再进行与运算。

5)移位运算

移位运算包括左移位和右移位,二者的运算方法相同,只是移位的方向不同。

左移位时原数字的各位向左移动,右侧用0补齐空位;右移位时原数字的各位向右移动,左侧用0或1补位(原数字为正数用0补位,原数字为负数用1补位)。

例:左移位(10100110)B<<2=(10011000)B

  右移位(10100110)B>>2=(11101001)B

左移1位相当于原数字乘以2,右移1位相当于原数字除以2。

二进制的位运算在单片机应用的开发过程中非常有用,很多看似复杂的操作,其实就是几种位运算的复合,比如X^(1<<(n-1)),配合循环语句就能实现X中的每一位数字的逐次翻转。有关二进制的位运算,需要读者开动脑筋多做练习,举一反三,熟能生巧。