位运算(C语言程序设计)_第1页
位运算(C语言程序设计)_第2页
位运算(C语言程序设计)_第3页
位运算(C语言程序设计)_第4页
位运算(C语言程序设计)_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 本章导读本章导读 本章是初学C语言者的一大难点,属较高要求,适合于编写系统软件的需要。读者应在掌握了计算机的几种基本数值编码的基础上,开始本章的学习。通过本章的学习我们将近一步体会到C语言既具有高级语言的特点,又具有低级语言的功能,它能直接对计算机的硬件进行操作,因而它具有广泛的用途和很强的生命力。 第第5章章 位运算位运算 本章主要知识点本章主要知识点 (1) 位运算符的含义及使用 (2) 位运算的特殊应用 (3) 位复合赋值运算符的含义及使用第第5章章 位运算位运算5.1 位运算的位运算的C程序实例程序实例5.2 二进制位运算二进制位运算5.3 综合实训综合实训【例5.1】编写程序完成对

2、两个整型量进行按位逻辑运算。程序名为5_1.cpp。#include stdio.hmain() int a,b;printf(input the numbers: );scanf(%d,%d,&a,&b);printf(%dn,a&b); /*输出按位与结果*/printf(%dn,a|b); /*输出按位或结果*/printf(%dn,ab); /*输出按位异或结果*/printf(%un,a); /*输出 a的按位取反结果*/运行情况为:input the numbers: 输入:9,5 1131242949672865.1 位运算的位运算的C程序实例程序实例例例

3、5.1程序演示程序演示输入源程序弹出运行结果窗口5.2 二进制位运算二进制位运算5.2.1 二进制位运算二进制位运算5.2.2 位复合赋值运算符位复合赋值运算符所谓位运算是指进行二进制位的运算。在系统软件中,常要处理二进制位的问题。C语言提供了按位运算的功能,这使得它与其它高级语言相比,具有很强的优越性。5.2.1 二进制位运算二进制位运算类 型运算符含义位逻辑运算符&按位与|按位或按位异或取反移位运算 符右移语言提供了六种位运算符(见表5-1):表5-1位逻辑运算与移位运算5.2.1 二进制位运算二进制位运算说明:运算量只能是整型或字符型的数据,不能为实型或结构体等类型的数据。六个位

4、运算符的优先级由高到低依次为:取反、左移和右移、按位与、按位异或、按位或。两个不同长度的数据进行位运算时,系统会将二者按右端对齐。下面对各种位运算符介绍如下:1“按位与按位与”运算符(运算符(&)2“按位或按位或”运算符(运算符(|)3“按位异或按位异或”运算符(运算符()4“求反求反”运算符运算符 ()5“左移左移”运算符运算符()1“按位与按位与”运算符(运算符(&)(1)规则:参与运算的两数(以补码方式出现)各对应的二进位相与(即逻辑乘),只有对应的两个二进位均为1时,结果位才为1,否则为0,它是双目运算符。即:0&0=0;0&1=0;1&0=0;

5、1&1=1。例如:9&5可写算式如下:9的二进制补码: 0 0 0 0 1 0 0 15的二进制补码: 0 0 0 0 0 1 0 1 & _ 0 0 0 0 0 0 0 1(1的二进制补码)可见9&5=1。1“按位与按位与”运算符(运算符(&)(2)特殊用途:清零按位与运算通常用来对某些位清0。由按位与的规则可知:为了使某数的指定位清零,可将该数按位与一特定数。该数中为1的位,特定数中相应位应为0;该数中为0的位,特定数中相应位可以为0也可以为1。由此可见,能对某一个数的指定位清零的数并不唯一。 【例5.2】取一个数中某些位可将该数与一个特定数进行&a

6、mp;运算,对于要取的那些位,特定数中相应的位设为1。【例5.3】取出数中某一位要相将一个数的某一位保留下来,可将该数与一个特定数进行&运算,特定数的相对应的那位应为1。【例5.4】【例【例5.2】实例】实例【例5.2】对原数00110110中为1的位清零。原数补码: 0 0 1 1 0 1 1 0清零的数: 1 1 0 0 0 0 0 0 (或01000000、00000000等) & _ 0 0 0 0 0 0 0 0 程序可写为:#include stdio.hmain() int a=0 x36,b=0 xc0,c; c=a&b; printf(a=%xnb=%

7、xnc=%xn,a,b,c);运行情况为:a=36b=c0c=0 例例5.2程序演示程序演示输入源程序弹出运行结果窗口【例【例5.3】实例】实例【例【例5.3】把】把a的高八位清的高八位清0,保留低八位。,保留低八位。可作可作a&255运算运算(255的二进制数为的二进制数为0000000011111111)。#include stdio.hmain() int a,b=255,c; scanf(%d,&a); c=a&b; printf(a=%xnb=%xnc=%xn,a,b,c); 运行情况为:运行情况为:输入:输入:920a=398b=ffc=98 例例5.3程序

8、演示程序演示输入源程序弹出运行结果窗口【例【例5.4】实例】实例【例【例5.4】编写程序将】编写程序将a(=9)的最低位取出。程序名为)的最低位取出。程序名为5_4cpp。#include stdio.hmain() int a=9,b=1,c; c=a&b; printf(a=%xnb=%xnc=%xn,a,b,c);运行情况为:运行情况为:a=9b=1c=1例例5.4程序演示程序演示输入源程序弹出运行结果窗口2“按位或按位或”运算符(运算符(|)(1)规则参与运算的两数(以补码出现)各对应的二进位相或(即逻辑加)。只要对应的两个二进位有一个为1时,结果位就为1,它是双目运算符。即:

9、0|0=0;0|1=1;1|0=1;1|1=1。例如:9|5可写算式如下:0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 | _ 0 0 0 0 1 1 0 1 (十进制为13)可见9|5=13。(2)特殊用途将一个数据的某些指定的位置为1。将该数按位或一个特定的数,该特定的数的相应位置为1。【例5.5】【例【例5.5】实例】实例【例5.5】将一个数的低5位置为1。程序名为5_5.cpp。只需将该数与“00011111”进行|运算。如: # # # # # # # # (#可代表0或1) 0 0 0 1 1 1 1 1 | _ # # # 1 1 1 1 1 #include

10、stdio.hmain() int a,b=31,c; scanf(%d,&a); c=a|b; printf(a=%xnb=%xnc=%xn,a,b,c);运行情况为:运行情况为:输入:输入:5a=5b=1fc=1f例例5.5程序演示程序演示输入源程序弹出运行结果窗口3“按位异或按位异或”运算符(运算符()(1)规则参与运算的两数(以补码出现)各对应的二进位相异或,当两对应的二进位相异时,结果为1,它是双目运算符。即:00=0;01=1;10=1;11=0。例如:95可写成算式如下:0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 1 _ 0 0 0 0 1 1 0 0 (

11、十进制为12) 可见95=12。(2)特殊用途使特定位翻转 【例5.6】要使哪几位翻转就将与其进行“按位异或”运算的数的相应位置为1。使特定位保留原值要使哪几位保留原值就将与其进行“按位异或”运算的数的相应位置为0。交换两个值,不用临时变量 【例5.7】【例【例5.6】实例】实例【例5.6】将01110001的低4 位翻转,高4位保留原值。 0 1 1 1 0 0 0 1 0 0 0 0 1 1 1 1 _ 0 1 1 1 1 1 1 0 (十进制126)程序可写为:#include stdio.hmain() int a=0 x71,b=0 xf,c; c=ab; printf(a=%xnb

12、=%xnc=%xn,a,b,c);运行情况为:运行情况为:a=71b=fc=7e例例5.6程序演示程序演示输入源程序弹出运行结果窗口【例【例5.7】实例】实例 【例5.7】设有整型数 a=5,b=7。编写程序利用位运算,将a和b的值互换。 程序中,通过顺序使用a=ab;b=ba;a=ab;三个赋值语句将两变量a、b的值互换。具体计算过程如下:第一步: a 0000000000000101 b 0000000000000111 a=ab 0000000000000010第二步: a 0000000000000010 b 0000000000000111 b=ba 0000000000000101

13、 (b的值为5)第三步: a 0000000000000010 b 0000000000000101 a=ab 0000000000000111 (a的值为7)【例【例5.7】实例】实例程序名为程序名为5_7.cpp。#include stdio.hmain() int a=5,b=7; printf(a=%d,b=%dn,a,b); a=ab;b=ba;a=ab; printf(a=%d,b=%dn,a,b);运行情况为:运行情况为:a=5,b=7a=7,b=5例例5.7程序演示程序演示输入源程序弹出运行结果窗口4“求反求反”运算符运算符 ()(1)规则对参与运算的数的各二进位按位求反,它是

14、单目运算符,具有右结合性。即:0=1;1=0。例如:9的运算为0000000000001001 _1111111111110110 (2)用途适当的使用可增加程序的移植性。如要将整数a的最低位置为0,我们通常采用语句a=a&1;来完成,因为这样对a是16位数还是32位数均不受影响。5“左移左移”运算符运算符() (1)规则把“”左边的运算数的各二进位全部左移若干位,由“”右边的数指定移动的位数,高位丢弃,低位补0,它是双目运算符。例如:a)(1)规则把“”左边的运算数的各二进位全部右移若干位,“”右边的数指定移动的位数。(2)特殊用途右移1位相当于该数除以2;右移n位相当于该数除以2n

15、。(3)说明对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0还是补1取决于计算机系统的规定。移入0的称为“逻辑右移”;移入1的称为“算术右移”。我们可以通过编写程序来验正所使用的系统是采用“逻辑右移”还是“算术右移”。很多系统规定为补1,即“算术右移”。如: a: 1001011111101101a1: 0100101111110110 ( 逻辑右移)a1: 1100101111110110 ( 算术右移)5.2.2 位复合赋值运算符位复合赋值运算符位运算符与赋值运算符结合组成位复合赋值运算符。位复合赋值运算符与算术复合赋值运算符相似,它们

16、的运算级别较低,仅高于逗号运算符,是自右而左的结合性。1分类位复合赋值运算符如表5-2所示:2运算过程(1)先对两个操作数进行位操作。(2)再将结果赋予第一个操作数(因此第一个操作数必须是变量)。如:a&=2;表示a=a&2;。表表5-2 位复合赋值运算符位复合赋值运算符运算符运算符名称名称例子例子等价于等价于&=位与赋值a&=ba=a&b|=位或赋值a|=ba=a|b=位异或赋值a=ba=ab=右移赋值a=ba=ab=左移赋值a=ba=a5”改成 “am”,且将“(03)”改成“(05; c=(04); d=b&c; printf(a=%xtd=%xn,a,d);运行情况如下:运行情况如下:input a number: 输入:输入:421 a=01a5 d=d例例5.9程序演示程序演示输入源程序弹出运行结果窗口【例【例5.10】实例】实例【例5.10】对某个整数x进行左循环移位,移n位。程序名为5_10.cpp。分析:设该数用2个字节存放,则原数中右边的16-n位向左移动,原数中左边的n位移至右边,如图5-5所示。先把x赋给中间变量a,b。把a右移16-n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论