还剩2页未读,继续阅读
文本内容:
第章位运算13第一单元学习指南本章教学目标
1.理解位运算符的功能以及每一种位运算符的主要用途
2.学会编写一般难度的位运算程序,并能上机调试运行学习方法建议
1.仔细阅读本章示例程序,正确理解每条语句的功能
2.着手编写一般难度的位运算程序可以用图示法验证变量中二进制值的变化过程
3.上机调试运行本章示例程序,并调试运行自己编写的程序,进一步体会位运算的功能
4.对于语法错误,采取与前面相同的应对措施着重检查参与位运算的变量的类型是否误用实型
5.对于逻辑错误,仍然可以采用在程序中添加临时性输出语句的方法,进行出错位置的定位
6.记录总结在调试程序的过程中发现的错误以及改正的方法第二单元重点与难点解析
1.按位与运算符有什么用途?按位与运算符有如下用途1清零若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合以下条件原来的数中为1的位,新数中相应位为0然后使二者进行运算,即可达到清零目的例原数为11,即00001011B,另找一个数,设它为4,即00000100B,将两者按位与运算00001011B00000100B00000000B一结果C语言源代码如下ttinclude stdio.h intmain void{int a=ll;〃二进制为:00001011int b=4;〃二进制为00000100a=ab;〃对变量a清零printf级d〃,a;〃输出结果是0return0;2取一个数中某些指定位若有一个整数a2byte,想要取其中的低字节,只需要将a与一个高字节全为0,低字节全为1的数按位与即可例如000000110100010100000000111111110000000001000101—结果C语言源代码如下ttinclude stdio.h intmain void{int a=0x0345;//用十六进制表示的0345,二进制为0000,0011,0100,0101int b=0x00ff;〃用十六进制表示的OOff,二进制为00000,0000,1111,1111int c;c=ab;〃变量c的值为变量a的低8位printf z,%xz,,c;〃以十六进制形式输出,结果是0045return0;3保留指定位与一个数进行“按位与”运算,要求此数在指定保留的位取1即可例如有一数19,即00010011B,想把其中从左边算起的第4,6,8位保留下来,运算如下000100112000101012000100012一结果是17即a=19,b=21,c=ab=17o C语言源代码如下ttincludestdio.h intmain void{int a=19;〃二进制为:00010011int b=21;〃二进制为:00010101int c;c=ab;〃按位与运算,保留了变量a的第4,6,8位从左边数printfC%dz,,c;//变量c的值17,二进制为00010001return0;
2.按位或运算符|有什么用途?按位或I运算常用来对一个数据的某些位定值为1例如如果想使一个数a的低4位改为1,则只需要将a与15进行按位或运算即可00111010B00001111B00111111B-结果C语言源代码如下ttinclude stdio.h intmain void{int a=58;〃二进制为00111010int b=15;//二进制为:00001111int c;c=a|b;〃按位或运算,将变量a的低4位全部设置为1printf〃%d〃,c;//变量c的值63,二进制为00H1111return0;3,异或运算符人有什么用途?异或运算符八有如下应用1使特定位翻转,要使哪几位翻转就将与其进行异或运算的这几位置为1即可设有数26其二进制表示为00011010,想使其低4位翻转,即1变0,0变1,可以将其与15其二进制表示为00001111进行“异或”运算,即00011010-0000111100010101运算结果的低4位正好是原数低4位的翻转C语言源代码如下ttinclude stdio.h intmain void{int a=26;〃二进制为:00011010int b=15;//二进制为:00001111int c;c=a-b;〃按位异或运算,将变量a的低4位实现翻转printfC%dz,,c;〃变量c的值21,二进制为0001010H return0;2与0相“异或”,保留原值例如023Ao0=02300010111■000000000010111—结果还是23因为原数中的1与0进行异或运算得1,T0得0,故保留原数C语言源代码如下ttinclude stdio.hint main(void){int a=23;〃二进制为00010111int b=0;〃二进制为00000000int c;c二a「b;〃按位异或运算,变量a的值保持不变printfC%d/z,c);〃变量c的值为23,与变量a的值相同,即变量a的值没有改变return0;)
(3)交换两个变量的值,不使用其他变量例如a=3(二进制为11),b=4(二进制为100)想将a和b的值互换,可以用以下赋值语句实现a■—a.b;b■-b a;a■—a b;解释如下a=ab;执行后变量a的值成为7(二进制为111)b=b7;执行后变量b的值成为3(二进制为011)a=ab;执行后变量a的值成为4(二进制为100)至此,变量a和变量b的值已经进行了互换再进一步解释如下1执行前两个赋值语句a=a-b;”和“b=b-a;相当于b廿(晨b)2再执行第三个赋值语句a=ab由于a的值等于(a-b),b的值等于(b-a-b),因此,相当于a二a八K b八a八b,即a的值等于a八a飞八b八b,即(Tb,等于bC语言源代码如下ftinclude stdio.h intmain(void){int a=3,b=4;a=a b;b=ba;a=a b;printf(z,a=%d,b=%d,,a,b);//结果:a=4,b=3,实现了互换return0;,)
4.使用左移运算符v进行左移时,是否每左移1位一定相当于该数乘以2使用左移运算符进行左移时,每左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,15VV2=60,即乘了4但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况例如若a为无符号短整型变量(占16位),则a=65535(二进制为时,左移一位时溢出的是1,结果变为65534(二进制为miiniiinino),就不是乘以2了c语言源代码如下ttinclude stdio.h intmain(void){unsigned shortint a=65535;printf(〃如\n〃,a);〃以无符号十进制整数形式输出变量a的值65535a=al;printf(〃加\n〃,a);〃以无符号十进制整数形式输出变量a的值65534return0;
5.使用位右移运算符》进行移位时,左边空出的位一定用0填充吗?不一定具体解析如下右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位注意对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0o如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统有的系统移入0,有的系统移入1移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
个人认证
优秀文档
获得点赞 0