C语言 40
第 12章 位运算课堂教学 1学时课堂教学累计 34学时
C语言 40
位运算符和位运算运算符 含义 运算符 含义
& 按位与 ~ 取反
| 按位或 << 左移
^ 按位异或 >> 右移位运算指二进制位的运算
C语言 40
说明:
1,位运算符中~为单目运算符
2,运算量只能是整型或字符型的数据,不能为实型数据.
C语言 40
按位与运算符 (&)
运算规则
0&0=0; 0&1=0; 1&0=0; 1&1=1
例,3&2=? 问,3&&2=?
3= 00000011
(&) 2= 00000010
00000010 结果
C语言 40
按位与的特殊用途
1.清零原来的数为1的位,新数中相应位为0
00101011 11011101
& 10010100 & 00000000
00000000 00000000
C语言 40
2.取一个数的指定位例,026254=(0010110010101100)2
分别取其低字节和高字节数据
0010110010101100
& 0000000011111111
0000000010101100
关键数字 0377,0177400
3.保留任意位
C语言 40按位或运算 (|)
运算规则
0|0=0; 0|1=1; 1|0=1; 1|1=1
思考:
060|017=077 060||017=?
C语言 40
“异或”运算 ( ∧ )
运算规则:参加运算的两个二进制数的相应位值不同则取1,反之相同则取0
例:使特定位翻转(低4位翻转)
0172 ∧ 017=0165
01111010
∧ 00001111
01110101
C语言 40
取反运算 (~)
运算规则:
0变1,1变0
例 ~ 025=0177752
思考:! 025=?
C语言 40
左移运算符 ( <<)
将一个二进制数全部左移若干位
右补0
高位左移后溢出,舍弃不起作用
例,a=15,左移2位
a=a<<2
00001111 -> 00 00111100
溢出 补0
结果,a=60
左移一位相当于该数乘以2
C语言 40
右移运算符 (>>)
将一个二进制数全部右移若干位
移到右端的低位被舍弃
高位需注意符号
例,a=15,右移2位
a=a<<2
00001111 -> 0000001111
补 0 舍弃
结果:3
右移一位相当于该数除以2(整除)
C语言 40
位段
计算机用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位,常常一个字节中放几个信息。
位段操作可以做到,向一个字节中的一个或几个二进制位赋值。
C语言 40
以位为单位指定成员长度
struct packed_data
{unsigned a,2; 占 2位,8位一个字节
unsigned b,6; a,b,c,d,i共占 4个字节
unsigned c,4;
unsigned d,4;
int i; }data;
a b c d i
2 6 4 4 16位
C语言 40
位段中数据的引用
data.a=3;
data.b=7;
data.c=9;
思考:
data.a=4; 可以吗?
C语言 40读程序
#include "stdio.h"
struct date
{unsigned day:5;
unsigned month:4;
unsigned year:7;
}d;
main( )
{int *p=&d;
d.year=2008-2004;
d.month=10;
d.day=20;
printf("%04x\n",*p);}
运行结果,0954
0 0 0 0,1 0 0 1,0 1 0 1,0 1 0 0
year month day
15 9 8 5 4 0