1 / 18

第十一章 位运算

第十一章 位运算. 11.1 位运算. C 语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数(或字符型)。位逻辑运算包括 & 、 | 、 ^ 、 ~ 四种运算,移位运算有 << 、 >> 两种运算。其中 ~ 是单目运算符。. 11.2 按位与 &. 参与运算的量,如果相对应的两位都为 1 ,则该位的结果值为 1 ,否则为 0 ,即: 0&0==0 0&1==0 1&0==0 1&1==1 如: a 的值为 0x1234 , b 的值为 0xff , a&b 运算的结果 c 应为:

evania
Download Presentation

第十一章 位运算

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第十一章 位运算

  2. 11.1 位运算 • C语言具有位逻辑运算和移位运算的独特功能,参与位运算的运算量必须是整数(或字符型)。位逻辑运算包括&、|、^、~四种运算,移位运算有<<、>>两种运算。其中~是单目运算符。

  3. 11.2 按位与& • 参与运算的量,如果相对应的两位都为1,则该位的结果值为1,否则为0,即: 0&0==0 0&1==0 1&0==0 1&1==1 • 如:a的值为0x1234,b的值为0xff,a&b运算的结果c应为: a 0001 0010 0011 0100 & b 0000 0000 1111 1111 c 0000 0000 0011 0100

  4. 11.2 按位与& • 按位与常用于将某个运算量的某些位清0或提取某些位的值,如本例中,将变量的高8位清0,同时保留或提取低8位的值,可用一个高8位为0,低8位为1的值0x00ff和它进行按位与。

  5. 11.3 按位或| • 参与运算的量,如果相对应的两位都为0,则该位的结果值为0,否则为1,即: 0|0==0 0|1==1 1|0==1 1|1==1 • 如:a的值为0x1234,b的值为0xff,a|b运算的结果c应为: a 0001 0010 0011 0100 |b 0000 0000 1111 1111 c 0001 0010 1111 1111

  6. 11.3 按位或| • 按位或常用于将某个运算量的某些位置1,如本例中将变量的低8位置1,高8位不变,可用一个高8位为0,低8位为1的值0x00ff和它进行按位或。

  7. 11.4 按位异或^ • 参与运算的量,如果相对应的两位相异,则该位的结果为1,否则为0,即: 0^0==0 0^1==1 1^0==1 1^1==0 • 如:a的值为0x1234,b的值为0xff,a∧b运算的结果c应为: a 0001 0010 0011 0100 ^b 0000 0000 1111 1111 c 0001 0010 1100 1011

  8. 11.4 按位异或^ • 按位异或有“与1异或”该位翻转,“与0异或”该位不变的规律。如本例中用0x00ff进行按位异或,使变量a的低8位翻转,高8位不变。 • 使用按位异或可以交换两个值,不用临时变量

  9. 11.4 按位异或^ 例如:x=12,y=34 x 0000 1100 ^y 0010 0010 (x) 0010 1110 x 0010 1110 ^y 0010 0010 (y) 0000 1100 x 0010 1110 ^y 0000 1100 (x) 0010 0010 例:交换两个变量的值 #include <stdio.h> main() { int x,y; printf("Enter integers x and y:\n"); scanf("%d,%d",&x,&y); x=x^y; y=x^y; x=x^y; printf(“%d, }

  10. 11.5 按位取反~ • 将参与运算量的相对应位的值取反,即1变0,0变1。 • 如:a的值为0x1234,~a运算的结果c应为: ~a 0001 0010 0011 0100 c 1110 1101 1100 1011

  11. 11.6 按位左移<< • 按位左移是将一个运算量的各位依次左移若干位,低位补0,高位舍弃不要。 • 假设机器字长为8位,变量a的值为16,将a左移二位,即a=a<<2: 左移前 0001 0000 左移后 0100 0000

  12. 11.6 按位左移<< • 由此看出,左移一位相当于该数乘2,左移二位相当于乘4,即22,但这要以该数左移之后不“溢出”为前提。所谓“溢出”指该数已超过机器字长所能容纳的范围,如该例若继续左移二位,该数为16× 24=256,超出了字长8位的表示范围(257),即产生了溢出。

  13. 11.7 按位右移>> • 按位右移是将一个运算量的各位依次右移若干位,低位被移出,高位对无符号数补0,对有符号数要按最高符号位自身填补。 • 右移一位相当于该数除以2,但有可能带来误差。假设机器字长为8位,变量a值为15,将a右移二位,即a=a>>2: 右移前 0000 1111 右移后 0000 0011

  14. 11.7 按位右移>> • 如果a是带符号的负数,a=-16,存放在机器中的补码为1111 0000,则a=a>>2,值为- 4。 右移前 1111 0000 右移后 1111 1100

  15. 运算符 名称 运算规则 & 位与 两个相应位全1为1,其余为0 | 位或 两个相应位全0为0,其余为1 ∧ 位异或 两个相应位相同为0,其余为1 ~ 取反 把操作数各位0变1,1变0 << 左移 把操作数左移指定的位数 >> 右移 把操作数右移指定的位数 位运算符的运算规则

  16. 11.8 位运算的复合赋值运算符 • 共有五种位运算的复合赋值运算符:&=(位与赋值)、|=(位或赋值) 、^= (位异或赋值) 、>>=(按位右移赋值)、<<= (按位左移赋值)。 • 例如: a ^=b 相当于a= a ^b a>>=3 相当于a= a>>3

  17. 以下程序的功能是进行位运算 main()  { unsigned char a, b;  a=7^3; b= ~4 & 3;  printf("%d %d\n",a,b);  } 程序运行后的输出结果是( A )  A)4 3  B)7 3  C)7 0  D)4 0

  18. 设有以下语句int a=1,b=2,c;c=a^(b<<2); 执行后,C的值为( D )A)6    B)7   C)8    D)9 • 若变量已正确定义,则以下语句的输出结果是( B )   s=32;   s^=32;  printf("%d",s);A) -1  B) 0   C) 1   D) 32

More Related