教学重点:位运算的实际应用场景
教学难点:负数的位运算(补码表示)、位运算与逻辑运算的区别、位运算的优先级和结合性
近三年高考考点、题型、分值分布:
| 考点 | 题型 | 分值列表 | ||||
| 2021年 | 2022年 | 2023年 | 2024年 | 2025年 | ||
| 位运算 | 单选题、程序分析结果题 | 5分 | 5分 | 5分 | 5分 | 5分 |
位运算在考试中占有稳定分值,掌握位运算对提高成绩至关重要!
位运算是指进行二进制位的运算,这些功能通常在汇编语言中才具备,因此C语言具有低级语言的成分。
位运算直接对内存中的二进制位进行操作,效率高,适合底层开发。
位运算符中除"~"以外,均为二目运算符,要求两侧各有一个运算量。运算量只能是整型或字符型的数据,不能为实型数据。
| 运算符 | 含义 | 优先级 | 规则 |
|---|---|---|---|
| & | 按位与 | 8 | |
| | | 按位或 | 10 | |
| ^ | 按位异或 | 9 | |
| ~ | 取反 | 2 | |
| << | 左移 | 5 | |
| >> | 右移 | 5 |
注意:"~"取反运算符的结合方向自右至左,其他都是自左至右。
重要提示:如果参加位运算的是负数,则要以补码形式表示为二进制数,然后再进行位运算。
"按位与"运算符是指参加运算的两个数据,按二进制位进行与运算。如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。
规则:0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1
练习1:下列程序的运行结果为:
练习2:下列程序的运行结果为:
练习3:下列程序的运行结果为:
练习4:下列程序的运行结果为:
练习5:下列程序的运行结果为:
练习6:下列程序的运行结果为:
"按位或"运算符是指参加运算的两个数据,按二进制位进行或运算。如果两个相应的二进制位有一个为1,则该位的结果值为1,否则为0。
规则:0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1
练习1:下列程序的运行结果为:
练习2:下列程序的运行结果为:
"按位异或"运算符是指参加运算的两个数据,按二进制位进行异或运算。如果两个相应的二进制位不同,则该位的结果值为1,否则为0。
规则:0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0
2019年真题:已知"int a=1,b=2,c=3,x;"与"x=(a^b)&c;",则x的值为?
A.0 B.1 C.2 D.3
2020年真题:执行“inta=3;a+=a^2;”后,则a的值是?
A.12 B.9 C.6 D.4
"左移"运算符用于将一个数的各二进制位全部左移若干位,高位左移后舍弃,低位补0。
规则:左移n位相当于乘以2的n次方(在不溢出的情况下)
2021年真题:下列程序的运行结果是:
"右移"运算符用于将一个数的各二进制位全部右移若干位,低位右移后舍弃,高位补符号位(对于有符号数)或补0(对于无符号数)。
规则:右移n位相当于除以2的n次方(对于正数)
2018年真题:若"int a=5,b;",执行"b=a>>2;"后, b的值是?
A.10 B.20 C.1 D.2
2023年真题:下列程序的运行结果是?
int main(){
int s=24,r=1;
while(s)
if(!(s& 0x01))r++;
else break;
s>>=1;
printf("r=%d\n",r);
}
"取反"运算符是一个单目运算符,用于对一个二进制数按位取反,即将0变为1,1变为0。
规则:~0 = 1, ~1 = 0
练习3:下列程序的运行结果为:
答案:-16
解析:15的二进制是00001111,取反后得到11110000,在补码表示中这是-16。
1. 位运算直接操作二进制位,效率高
2. 注意负数的补码表示形式
3. 区分位运算(&,|,^)和逻辑运算(&&,||,
4. 掌握位运算的优先级和结合性