
第12章位运算 位运算功能是C语言的一大特色功能。 所谓位运算是指针对数据中的二进制位进行的 运算
第12章 位运算 位运算功能是C语言的一大特色功能。 所谓位运算是指针对数据中的二进制位进行的 运算

12.1位运算符和位运算 C语言中有6种基本位运算符。 一、按位与运算符& short int a=3,b=5,c=a&b; 则c的结果为1。 因为0000000000000011B &0000000000000101B =0000000000000001B
12.1 位运算符和位运算 C语言中有6种基本位运算符。 一、按位与运算符& 如 short int a=3,b=5,c=a&b; 则 c的结果为1。 因为 00000000 00000011B & 00000000 00000101B - = 00000000 00000001B

二、按位或运算符 进行按位或运算时,只有相运算的两位均为0 时,结果位才为0。 short int a=3,b=5,c=alb; 则c的结果为7。 因为0000000000000011B |0000000000000101B =0000000000000111B
二、按位或运算符| 进行按位或运算时,只有相运算的两位均为0 时,结果位才为0。 如 short int a=3,b=5,c=a|b; 则 c的结果为7。 因为 00000000 00000011B | 00000000 00000101B - = 00000000 00000111B

三、按位异或运算符 进行按位异或运算时,若相运算的两位相异, 则结果位为1;若相运算的两位相同,则结果位为0。 short int a=15,b=10,c=ab; 则c的结果为5。 因为0000000000001111B ^0000000000001010B =0000000000000101B
三、按位异或运算符^ 进行按位异或运算时,若相运算的两位相异, 则结果位为1;若相运算的两位相同,则结果位为0。 如 short int a=15,b=10,c=a^b; 则 c的结果为5。 因为00000000 00001111B ^00000000 00001010B =00000000 00000101B

四、按位取反运算符~ 进行按位取反运算时,若运算位为0,则结果 位为1;若运算位为1时,则结果位为0。 如short int a=15,b=~a; 则b的结果为65520。 因为~0000000000001111B =1111111111110000B
四、按位取反运算符~ 进行按位取反运算时,若运算位为0,则结果 位为1;若运算位为1时,则结果位为0。 如 short int a=15,b=~a; 则 b的结果为65520。 因为~00000000 00001111B =11111111 11110000B

五、按位左移运算符<< 格式: 变量<<n 其中n是左移的位数 功能: 用于将变量的内容左移n个二进制位。即从左边去掉n 位,从右边补上n个0。 如inta=15,b=a<<2; 则b的结果为60。 因为0000000000001111B<<2 =0000000000111100B 可见,左移一位相当于乘以2
五、按位左移运算符<< 格式: 变量<<n 其中n是左移的位数 功能: 用于将变量的内容左移n个二进制位。即从左边去掉n 位,从右边补上n个0。 如 int a=15,b=a<<2; 则 b的结果为60。 因为00000000 00001111B<<2 =00000000 00111100B 可见,左移一位相当于乘以2

六、按位右移运算符>> 格式: 变量>>n 其中n是右移的位数 功能: 用于将变量的内容右移个二进制位。即从右 边去掉n个二进制位,从左边补上n个二进制位。 对于无符号整数,左边补0;对于有符号整数, 左边补符号位
六、按位右移运算符>> 格式: 变量>>n 其中n是右移的位数 功能: 用于将变量的内容右移n个二进制位。即从右 边去掉n个二进制位,从左边补上n个二进制位。 对于无符号整数,左边补0;对于有符号整数, 左边补符号位

如inta=16,b=a>>2; 则b的结果为4。 因为0000000000010000B>>2 =0000000000000100B 如inta=-16,b=a>>2; 则b的结果为-4。 因为1111111111110000B>>2 =1111111111111100B 可见,右移一位相当于除以2
如 int a=16,b=a>>2; 则 b的结果为4。 因为00000000 00010000B>>2 =00000000 00000100B 如 int a=-16,b=a>>2; 则 b的结果为-4。 因为11111111 11110000B>>2 =11111111 11111100B 可见,右移一位相当于除以2

12.2 位运算举例 例12.1用位运算分离出一个无符号整数的第4至第 7位。 程序如下: main() {unsigned a,b,c,d; scanf("%o",&a); b=a>>4; C=~(~0<<4)月 d=b&c; printf("%0,%din",a,a); printf("%0,%dIn",d,d);
12.2 位运算举例 例12.1 用位运算分离出一个无符号整数的第4至 第 7位。 程序如下: main() {unsigned a,b,c,d; scanf("%o",&a); b=a>>4; c=~(~0<<4); d=b&c; printf("%o,%d\n",a,a); printf("%o,%d\n",d,d); }

例12.2用位运算将一个无符号整数循环右移若干位。 程序如下: main() {unsigned a,b,c; int n; scanf("%0%d",&a,&n); b=a>n; c=cb; printf("%0,%dln",a,c);
例12.2 用位运算将一个无符号整数循环右移若干位。 程序如下: main() {unsigned a,b,c; int n; scanf("%o%d",&a,&n); b=a>n; c=c|b; printf("%o,%d\n",a,c); }