《吉大康辉老师讲C语言》第9章: 位运算.ppt

《吉大康辉老师讲C语言》第9章: 位运算.ppt

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《吉大康辉老师讲C语言》第9章: 位运算

第9章 位运算 9.1 位及位运算的概念 位运算:二进制位的运算。 在内存中每一个字节有一个地址。 一个字节由8位二进制位组成。 位操作是直接对二进制位进行的,位运算只适用于无符号整型变量。 9.2 位运算符 C语言提供如下位运算符。其中除运算符~以外。都是二目运算符。 运算符 语义 按位与 | 按位或 ∧ 按位异或 ~ 按位取反 左移 右移 9.2 位运算符 1.按位“与”运算符 参加运算的两个运算量,如果对应二进制位都是1,则该位的结果为1,否则该位是0。 例: 用按位与操作实现宏is_odd,它判断某个整数是否为奇数: #define is_odd(x) (1(unsigned)(x)) 也可以用按位与运算屏蔽掉某些二进制位,如: c=n0177 9.2 位运算符 2.按位“或”运算符| 参与运算的两个运算量,如果对应二进制位都是0,则该位的结果值为0,否则该位的结果值是1。 按位或运算用来对一个数据的某些二进制位置1。 例如: x | MASK 的运算结果是将x中相应于MASK为1的那些位置1。 9.2 位运算符 3.按位“异或”运算符∧ 按位异或运算是使参与运算的两个量,如果对 应二进制位不同,则该位结果是1,否则该位 的结果是0。 按位异或操作可以用来检查两个字是否相同。 例如: if(x∧y) … /* x和y不同*/ 9.2 位运算符 4. 按位“取反”运算符~ ~是单目运算符,用来对一个二进制数按位取反,即将0变为1,将1变成0。 这个操作可用于某些依赖于具体计算机字长的应用中,从而使结果代码是可移植的。 例如: 用来将字x的低3位清零: x=x0xfff8; 但这个操作只能应用于16位字长的计算机。如果计算机的字长为32位,结果将会有所不同。 一个可移植的方法是: x=x|~0x7; 这种表达方式与机器字长无关,也无需额外开销,因为~0x7是个常量表达式,所以是在编译时求值的。 9.2 位运算符 5. 左移运算符 xn: 把x的每个二进制位左移n位,丢掉最左边的n位,右侧补0。 左移1位相当于该数乘以2。 左移比乘法运算快得多。 6. 右移运算符 xn:把x的每一个二进制位右移n位,丢掉最右边的n位,最左边的n位补0。 右移一位相当于将该数除以2。 对于负整数,高位补1。 9.2 位运算符 7. 位运算符与赋值运算符结合可以组成复合的赋值运算符,这样的运算符有:=、|=、=、=和^= a=b 相当于 a=ab a|=b 相当于 a=a|b a=b 相当于 a=ab a=b 相当于 a=ab a^=b 相当于 a=a^b 9.2 位运算符 8. 不同长度的数据进行位运算 如果两个数据长度不同,则在进行位运算时系统会将二者自动按右端对齐。 例如: ab,这里a是long型,b为int型。 如果长度短的数是正数,则左侧用0补满。 如果长度短的数是负数,则左侧用1补满。 在进行运算时,建议采用无符号整数,尽量不用带符号的数。 9.3 位运算举例 [例9.1]设计一个函数,它返回整型量x从右向左数的第p位开始的连续n位所构成的整数值。 #define ERROR (-1) #define BITSinCHAR 8 getbits(x, p, n) unsigned x,p,n; {if(p0 || p=sizeof(x)*BITSinCHAR) return(ERROR); return((x(p+1-n))~(~0n)); } 9.2 位运算符 [ 例9.2]将整型量a循环右移n位。 #define BITSinCHAR 8 main() {unsigned a,b,c; int n; scanf(“a=%o,n=%d”,a,n); b=a(sizeof(a)*BITSinCHAR-n); c=an; c|=b; printf(“%o\n%o”,a,c); } * * 0 1 1 1 1 1 0 1 最低位 最高位

您可能关注的文档

文档评论(0)

tonggong82445 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档