运算符

 

第11章  位运算

授课日期***********************************
授课班级***********************************
   

位运算

教学目的

学习本章的目标,是为了让读者对位运算的知识有所了解,为对计算机的硬件操作做准备。  

重点难点

重点:理解位运算符的含义及使用,掌握简单的位运算。    

难点:位段。

教学手段

多媒体教学

复习提问

 1. 结构体成员变量的使用方法?

 2.结构与联合的区别?           

课程

内容

提纲

● 位运算符

● 位段 

课外作业

练习题十一

教学心得

位运算与算数运算的区别是教学的关键。

 第一节           位运算符 

一般用字节(Byte)作为计算机信息的基本单位,一个字节由8个二进制位组成,其中最右边的一位称为“最低有效位”LSB,最左边的一位称为“最高有效位”MSB,如图11-1所示。最低有效位也称第0位,最高有效位也称第7位。 

 

7

 

6

 

5

 

4

 

3

 

2

 

1

 

0

 

11-1

 

位运算符

含义

&

按位与

MSB

 

 

 

 

 

 

LSB

 

|

按位或

1

0

0

1

0

0

0

1

 

^

按位异或

 

11-1

 

~

按位取反

 

<< 

左移

>> 

右移

C语言提供了6种位运算符,如表11-1所示。

 

说明:

(1) 位运算符中除了“~ 以外,均为二目运算符。

(2) 运算量只能是整型或字符型的数据,不能为实型数据。

 

   一、         位“与”运算(&) 

1.运算规则 

参加运算的两个运算量,如果两个相对应的位都为1,该位结果值为1,否则为0。可记为“见00”。 

 

1

0

0

1

1

0

0

1

&

1

1

1

0

1

0

1

0

 

1

0

0

0

1

0

0

0

2.“按位与”的特殊用途

 

(1)清零

方法:任何数与一个各个位均为零的数值相与,结果为零。

 

1

0

0

1

1

0

0

1

&

0

0

0

0

0

0

0

0

 

0

0

0

0

0

0

0

0

(2)取一个数X中某些指定位。

方法:找一个数,此数的各个位将按照这样原则取值:对应于x要取的位,该数对应位为1,其余位为0。则此数与x按位相与就可以得到X中的某些位。

11-3 假设有X=l0101110B,想取X的低4位。

分析:由于欲取X的低41,则可以将XY=00001111B相与,即可得到X的低4位。则有: 

 

1

0

1

0

1

1

1

0

&

0

0

0

0

1

1

1

1

 

0

0

0

0

1

1

1

0

   二、         位“或”运算

1.运算规则

参加运算的两个运算量,如果两个相对应的位中有—个为1,则该位结果值为1,否则为0。可记为“见11”。

 

1

1

0

1

0

0

1

1

|

1

0

0

0

1

0

1

0

 

1

1

0

1

1

0

1

1

2.“按位或”的特殊用途:

常用来对一个数据的某些位置1 就是找一个数,此数的各个位将按照这样规则取值:对应于X要置1的位,该数对应位为1,其余位为零0,则此数与X相或就可使X中的某些位置1

11-5 假设有X=11010010B,想使X的低4位为l

 

1

1

0

1

0

0

1

0

|

0

0

0

0

1

1

1

1

 

1

1

0

1

1

1

1

1

三、          “异或”运算(^)

 

1.运算规则

参加运算的两个运算量,如果两个对应的位为相“异”(值不同),则该位结果值为1。可记为“见同则0”。 

 

1

0

0

0

1

0

0

1

^

1

1

1

0

1

1

1

0

 

0

1

1

0

0

1

1

1

2.“异或”的特殊用途:使特定位翻转

方法:找—个数,此数的各个位将按照这样规则取值:对应于X要翻转的位,该数对应位为1,其余位为零。则此数与X相异或即可。

ll-7 假设有X=10101110B,则想使X的低4位翻转。

 

1

0

1

0

1

1

1

0

^

0

0

0

0

1

1

1

1

 

1

0

1

0

0

0

0

1

 四、         “取反”运算(~)

 1.运算规则

对一个二进制数按位取反,即将0变为l1变为0

~

1

0

0

0

1

0

1

1

 

0

1

1

1

1

1

0

0

2.注意事项

(1) 单目运算符,具有右结合性;

(2) ~运算符的优先级别比算术运算符、关系运算符逻辑远符和其运算符都高。 

   五、         “左移”运算(<<) 

运算规则:将一个数的各个二进制全都左移若干位(左丢弃,右补0)

   六、         “右移”运算(>>) 

运算规则:将一个数的各个二进制全部右移若干位。最端低位丢弃,对于无符号数最高位补0;对于有符号数:正数则最高位补0,如果为负数,左端最高位补0还是补1则取决于所用的C编译系统。如果补0则称为“逻辑右移”,l则称为“算术右移”。

    七、         位运算赋值运算 

位运算符与赋值运算符相结合,就组成复合赋值运算符,表11-2所示。

11-2

复合赋值运算符

实例

等价实例

&=

a&=b

a=a&b

| =

a | =b

a=a | b

^=

a^=b

a=a^b

<<=

a<<=b

a=a<<b

>>=

a>>=b

a=a>>b

第二节           位段

 有时信息不需要一个字节,只要一位或几位即可,例如:网络传输协议,控制信息往往只用一个字节中的一位或几位。

C语言中,为了方便访问这些信息,定义了位段(或称“位域”)类型,它是用结构体来表示的。所谓位段是把一个字节中的二进位划分为几个不同的段,并说明每个段的位数。每个段有一个段名,允许在程序中按段名进行操作。这样就可以把几个不同的对象用一个字节的不同二进制位段来表示。 

   一、          位段的定义 

位段的定义形式:

    struct 位段结构{位段列表};

位段列表的形式:

类型说明符 位段名:位段长度

例如: 

    struct  wd

    {

        int a:5;

        int b:2;

        int c:1;

        unsigned d:5;

    }

对位段的定义的几点说明:

 (1) 位段的成员类型必须定义指定为unsignedint型。

 (2) 一个位段必须存只能储某一个字节中,不能跨两个字节。如一个内存单元所剩空间不够存放另一位段时,应从下一内存单元起存放该位段。也可以有意使某位段从下一内存单元开始。

(3) 位段成员的长度不能大于一个字节的长度,即不能超过8位二进位。

(4) 位段可以含无名成员,这时它只用来作填充或调整位置。无名的位段成员是不能使用的。

    二、          位段的引用

位段的引用和结构成员的引用相同、其一般形式为

    位段变量名. 位段成员名

位段允许用各种格式输出。

ll-11 位段成员的输出格式。

程序如下:(WYS02.C

#include <stdio.h>

void main()

{

    struct

    {

             unsigned a:1;

             unsigned b:3;

       int :3;

             unsigned c:4;

      }bit,*pb;

   bit.a=1;

      bit.b=7;

      bit.c=15;

   printf("%d,%d,%d"n",bit.a,bit.b,bit.c);

      pb=&bit;

      pb->a=0;

      pb->b^=5;

      pb->a&=0xa;

   printf("%x %x %x"n",pb->a,pb->b,pb->c);

}

运行结果:

1,7,15

0 2 f

分析:

(1) 程序中定义了位段结构,3个位段成员为abc,说明了此类型的变量bit和指向此类型的指针变量pb

(2) 程序接下来分别给3个位段成员赋值。(注意赋值不能超过该位域的允许范围)

(3) 程序进跟着以整型量格式输出3个位段成员的内容。

(4) 然后程序把位段变量bit的地址送给指针变量pb

(5) 程序接下来使用指针给更新位段成员的值。

(6) 程序最后使用指针输出了这3个位段成员的值。

转载于:https://www.cnblogs.com/ThirdEye/archive/2009/04/04/1429485.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值