二进制是计算技术中广泛采用的一种数制。二进制数是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。二进制数也是采用位置计数法,其位权是以2为底的幂[1]。 二进制位运算对于数字信号的处理,硬件内存的读写都非常的重要。比如航天火箭的指令解码,挑点参数的计算,特征码的处理。而上述的数据处理都要用到二进制的与、异或、移位等运算。
大学的理工类学生,学习完计算机基础课程后,就进入了计算机C语言学习,基本掌握了二进制的原码、补码及二进制的基本元算,通过对C语言变量、常量以及数据的存储格式的学习,了解了字节(byte)、位(bit)等存储单元[2]的关系,而对于二进制的位运算应用起来比较困难,部分同学掌握了二进制位运算的基本规律,也很难应用位运算解决一些实际问题。为了更好地帮助学生掌握二进制位运算的基本理论,拓展学生解决实际问题的能力,提高学生计算思维,文章按照了解——掌握——运用的认知规律进行了教学设计。首先回顾二进制的基本概念及数据表示,然后重点讲解二进制的位运算,最后利用位运算解决实际问题。
回顾二进的基本概念
(1) 二进制位与字节
计算机系统的内存储器,是由许多称为字节的单元组成的,1个字节由8个二进制位(bit)构成,每位的取值为0/1。最右端的那1位称为“最低位”,编号为0;最左端的那1位称为“最高位”,而且从最低位到最高位顺序,依次编号(重点突出突出高低位)。图1是1个字节各二进制位的编号。
(2)数值的原码表示
数值的原码表示是指,将最高位用作符号位(0表示正数,1表示负数),其余各位代表数值本身的绝对值(以二进制形式表示)的表示形式。为简化描述起见,本节约定用1个字节表示1个整数。例如,+9的原码是00001001,符号位上的0表示正数,如图2
-9的原码是10001001。符号位上的1表示负数,如图3
(3)数值的反码表示(做重点讲解,并进行实例板书)
数值的反码表示分两种情况:
(1)正数的反码:与原码相同。
例如,+9的反码是00001001。
(2)负数的反码:符号位为1,其余各位为该数绝对值的原码按位取反(1变0、0变1)。
例如,-9的反码:因为是负数,则符号位为“1”;其余7位为-9 的绝对值+9的原码0001001按位取反为1110110,所以-9的反码是11110110。
(4)数值的补码表示(做重点讲解,并进行实例板书,重点突出补码求取的过程)
数值的补码表示分两种情况:
1正数的补码:与原码相同。
例如,+9的补码是00001001。
2负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-9的补码:因为是负数,则符号位为“1”;其余7位为-9的绝对值+9的原码0001001按位取反为1110110;再加1,所以-9的补码是11110111。
已知一个数的补码,求原码的操作分两种情况:
1如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
2如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位不变,其余各位取反,然后再整个数加1。例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111(板书整个运算过程)。
(5)数值在计算机中的表示──补码
在计算机系统中,数值一律用补码表示(存储),原因在于:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
板书实例:9+(-9)二进制运算
重点讲解位运算
(1)按位与:&
1格式:x&y
2规则:对应位均为1时才为1,否则为0:3&9=1。
板书实例:3&9=1
3主要用途:取(或保留)1个数的某(些)位,其余各位置0。
(2)按位或:|
1格式:x|y
2规则:对应位均为0时才为0,否则为1:3|9=11。
板书实例:3|9=11
3主要用途:将1个数的某(些)位置1,其余各位不变。
(3)按位异或:^
1格式:x^y
2规则:对应位相同时为0,不同时为1:3^9=10。
3主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的 变为1,其余各位不变。
板书实例:3^9=10
(4)按位取反:~
1格式:~x
2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1:在
IBM-PC机中,~0=0xffff,~9=0xfff6。
3主要用途:间接地构造一个数,以增强程序的可移植性。
(5)按位左移:<<
1)格式:x<< 位数
2规则:使操作数的各位左移,低位补0,高位溢出:5<<2=20。
板书实例:5<<2=20
(6)按位右移:>>
1)格式:x>>位数
2规则:使操作数的各位右移,移出的低位舍弃;高位:
a对无符号数和有符号中的正数,补0;
b有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。例如,20 >> 2=5。
知识拓展,实际应用
(1) 指令解码
在航天领域中,火箭的飞行都受到相应的指令控制,如何知道这些指令被执行,一般来说,在雷达接受到的帧格式的数据中,其中会有四个字节带有指令的特征码,一般为高5位或者是高7位,而余下的低位则存放指令的执行时间,一般精确到毫秒。如图4:其中指令码为11001
图4
如何来提取指令的特征吗和发生的时间,就要用到二进制的与位运算,将指令码与时间分开。先解决指令的特征吗,后解出指令发生的时间,解决过程如下:
将上图4中的二进制数与下面图5中的二进制数相与,得到结果如图5,再将图4二进制换算成的十进制数减去图6二进制换算成十进制数,便得到指令时间。
图5(高5位为1其余位为0)
图6(指令码)
板书求解过程(图7):
图7(求解过程)
C语言实现代码如下(现场调试、演示):
#include stdio.h
Main(){
Unsigned long lz,zl,zl0,timep;//zl代表指令,lz代表四字节的指令数,zl0代表与运算的指令值,timep代表指令发生的时间
zl=3355443200;//二进制码如图5
lz=346560640;
if((lz&4160749568)==zl){//lz与高5位为1其余位为0的数
timep=lz-zl;//得到指令发生时间(单位为毫秒)
}
Printf(timep);
}
(2)多布尔字段二进制表示