第12章,位运算,第2页,主要内容,位运算符与位运算 位段 程序案例 小结 习题,第3页,12-1 位运算符与位运算,“按位与”运算 “按位或”运算 “按位异或”运算 “按位取反”运算 “左移”运算 “右移”运算 位运算赋值运算符,第4页,位运算符,注意:位运算的数据对象只能是C标准中的char和int数据类型,而不能用于float、double、long double、void和其他复杂类型第5页,12-1-1 “按位与”运算,C语言规定按位与的运算规则为:如果参与运算的两个整数或字符按照二进制位对齐,相应的两位进行“与”运算,对应两位都是1时,结果为1,否则只要有0出现的位,其对应的二进制位与的结果都为0 格式为:a&b 显然,任何数与0进行按位与运算的结果为0,与-1(二进制位全为1)进行按位与运算的结果为其本身第6页,注意,不可将运算符“&”与运算符“&&”混淆对于运算符“&&”,当两边操作数为非0值时,表达式的运算结果为1;但对于运算符“&”,则需要对每位进行与运算第7页,12-1-2 “按位或”运算,按位或的运算规则为:如果参与运算的两个整数或字符按照二进制位对齐,相应的两位进行“或”运算,对应两位都是0时,结果为0,否则只要有1出现的位,其对应的二进制位或的结果都为1。
格式为:a|b,第8页,12-1-3 “按位异或”运算,按位异或的运算规则为:如果参与运算的两个整数或字符按照二进制位对齐,相应的两位进行“异或”运算,对应两位相同时,结果为0,否则为1 格式为:a^b,第9页,12-1-4 “按位取反”运算,按位取反的运算规则为:将一个数中的各位二进制数取反,即0变为1,1变为0 按位取反运算是单目运算 格式为: ~a,第10页,12-1-5 “左移”运算,左移运算的运算规则为:将运算对象中的每个二进制位向左移要求的位数,从左边移出去的高位部分被丢弃,右边空出的部分用0填补 格式为:a整型表达式;,第11页,12-1-6 “右移”运算,右移运算的运算规则为:将运算对象中的每个二进制位向右移要求的位数,从右边移出去的低位部分被舍弃,对无符号的数来说,左边空出的部分补0;对有符号数来说,如果符号位为0,则空出的高位部分补0,符号位为1则补1这是Turbo C和其他一些C编译采用的 格式为:a整型表达式;,第12页,12-1-7 位运算赋值运算符,位运算符与赋值运算符可以组成复合赋值运算符,位运算赋值运算符共有5种: &= |= ^= =,第13页,12-2 位段,内存中信息的存取一般以字节为单位。
在计算机用于过程控制、参数检测或数据通信等领域时,控制信息往往只占一个字节中的一个或几个二进制位,如“真”或“假”用0或1表示,只需1位即可因此,一个字节常常可以存放几个信息 那么,怎样向一个字节中的一个或几个二进制位赋值以及改变它的值呢?这就要用到位段(bit field)当然也可以在一个字节中人为地设置几项,但给其中某几位赋值太麻烦不如用位段结构体的方法方便 C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”利用位段能够用较少的位数存储数据第14页,位段的定义方法如下,struct bit_data { unsigned int a:1;unsigned int b:1; unsigned int c:2;unsigned int d:4; unsigned int e:8; int i; }data; 上面定义了位段结构类型struct bit_data,它包含6个成员,又称位段,如下图所示其中a、b、c、d、e分别为1位、1位、2位、4位、8位,i为整型,占2个字节16位共占4个字节第15页,接上,第16页,12-3 程序案例,【例】设计一个函数,给出一个数的十六进制原码,得到该数的十六进制补码。
分析:根据补码的定义,一个正数的补码等于该数的原码,一个负数的补码等于该数的反码加1假设a为16位整数,则步骤为: 判别给定整数是正数还是负数方法是:语句z=a中若z等于0,则a为正数;若为非0,则a为负数 如果z非0,有z=~a+1+0x80000;否则z=a 返回z第17页,接上,#include main() { int a,get(int); printf(“输入一个十六进制数: “); scanf(“%x“,,第18页,接上,z=value },第19页,运行结果为,输入一个十六进制数:-eeff 它的补码是:1101,第20页,12-4 小结,按位与(&) C语言规定按位与的运算规则为:如果参与运算数据的二进制位都为1,则结果为1;否则只要有0出现的那个二进制位结果都为0 按位或(|) 按位或的运算规则为:只要参与运算的两个数中对应的二进制位为1,则结果的对应位为1;否则为0第21页,接上,按位异或(^) 按位异或运算的运算规则为:如果两个运算对象的对应位不相同,则结果为1;否则为0 按位取反(~)第22页,接上,左移运算() 右移运算符的运算规则是:将运算对象中的每个二进制位向右移若干位,从右边移出的低位部分被舍弃。
对无符号的数来说,左边空出的部分补0;对有符号数来说,如果符号位为0则空出的高位部分补0,对于有符号数中的负数,取决于所使用的系统,补0的称为“逻辑右移”,补1的称为“算术右移”第23页,接上,所谓位段就是将一个机器字分成几段,以占用二进制位的数目来管理数据,它常常是用来表示和处理不需要整字节存储的信息,这样的信息可能是3位,也可能是9位……甚至是它们的组合 位段类型也称为数据结构体类型,因此其类型定义的方法和结构体相同,不过对于非整数字节的成员,应当使用unsigned或unsigned int来定义成员,并指明所占的位数。