C语言位运算教学

教学课题:C语言位运算-吴京华

课时安排:2课时(90分钟)

基于历年高考真题分析

参考书籍《综合知识理论下》编制
1 / 12
返回教学目录

教学目标

知识与技能

  • 理解位运算的基本概念和特点
  • 掌握C语言中六种位运算符的使用方法
  • 能够运用位运算解决实际问题
  • 理解位运算与逻辑运算的区别

教学重点:位运算的实际应用场景

教学难点:负数的位运算(补码表示)、位运算与逻辑运算的区别、位运算的优先级和结合性

2 / 12

考点分析

近三年高考考点、题型、分值分布:

考点 题型 分值列表
2021年 2022年 2023年 2024年 2025年
位运算 单选题、程序分析结果题 5分 5分 5分 5分 5分

位运算在考试中占有稳定分值,掌握位运算对提高成绩至关重要!

3 / 12

位运算概述

位运算是指进行二进制位的运算,这些功能通常在汇编语言中才具备,因此C语言具有低级语言的成分。

位运算直接对内存中的二进制位进行操作,效率高,适合底层开发。

// 位运算示例
int a = 5; // 二进制: 0101
int b = 3; // 二进制: 0011
int c = a & b; // 按位与: 0001 (十进制1)

位运算符中除"~"以外,均为二目运算符,要求两侧各有一个运算量。运算量只能是整型或字符型的数据,不能为实型数据。

4 / 12

C语言位运算符

运算符 含义 优先级 规则
& 按位与 8
| 按位或 10
^ 按位异或 9
~ 取反 2
<< 左移 5
>> 右移 5

注意:"~"取反运算符的结合方向自右至左,其他都是自左至右。

重要提示:如果参加位运算的是负数,则要以补码形式表示为二进制数,然后再进行位运算。

5 / 12

"按位与"运算符(&)

"按位与"运算符是指参加运算的两个数据,按二进制位进行与运算。如果两个相应的二进制位都为1,则该位的结果值为1,否则为0。

规则:0 & 0 = 0, 0 & 1 = 0, 1 & 0 = 0, 1 & 1 = 1

练习1:下列程序的运行结果为:

#include<stdio.h>
main(){
  int a=45, b=26;
  printf("%d", a&b);
}

练习2:下列程序的运行结果为:

2019年 题22:已知“int a=1,b=2,c=3,x;”与“x=(a^b)&c;”,则x的值为?

练习3:下列程序的运行结果为:

2020年 下列程序的运行结果是?
main(){
int a[]={118,65,128};int i;
for(i=0;i<3;i++)
printf("%c",(a[i])&(a[i]-1)?'N':'Y');
}

练习4:下列程序的运行结果为:

2022年试题 下列程序的运行结果是?
main(void){
unsigned int V=7;int num=0;
while(V){V&=(V-1);num++;}
printf("num=%d",num);
return 0;
}

练习5:下列程序的运行结果为:

2025年 题21:程序段{int a=3;printf("%d",(a&3));}的执行结果是?

练习6:下列程序的运行结果为:

2023年 int main(){
int s=24,r=1;
while(s){
if(!(s& 0x01))r++;
else break;
s>>=1;}
printf("r=%d\n",r);
}
6 / 12

"按位或"运算符(|)

"按位或"运算符是指参加运算的两个数据,按二进制位进行或运算。如果两个相应的二进制位有一个为1,则该位的结果值为1,否则为0。

规则:0 | 0 = 0, 0 | 1 = 1, 1 | 0 = 1, 1 | 1 = 1

"按位或"的用途:

  • 置位:将某些位置1,其他位保持不变
  • 合并数据:将多个数据合并到一个变量中
// 将低4位置1示例
int a = 0x12; // 二进制: 00010010
int b = a | 0x0F; // 结果: 00011111 (十进制31)

练习1:下列程序的运行结果为:

#include<stdio.h>
main(){
  int a=6, b=26;
  printf("%d", a|b);
}

练习2:下列程序的运行结果为:

#include<stdio.h>
main(){
  int a=6, b=16;
  printf("%d", a|b);
}
7 / 12

"按位异或"运算符(^)

"按位异或"运算符是指参加运算的两个数据,按二进制位进行异或运算。如果两个相应的二进制位不同,则该位的结果值为1,否则为0。

规则:0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0

"按位异或"的用途:

  • 翻转特定位:将某些位翻转(0变1,1变0)
  • 交换两个变量的值:不使用临时变量交换两个变量的值
  • 加密:简单的数据加密
// 交换两个变量的值示例
int a = 5, b = 9;
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 现在a=9, b=5

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

8 / 12

"左移"运算符(<<)

"左移"运算符用于将一个数的各二进制位全部左移若干位,高位左移后舍弃,低位补0。

规则:左移n位相当于乘以2的n次方(在不溢出的情况下)

"左移"的用途:

  • 快速乘法:左移n位相当于乘以2的n次方
  • 创建掩码:用于创建位掩码
// 左移示例
int a = 5; // 二进制: 00000101
int b = a << 2; // 结果: 00010100 (十进制20)

2021年真题:下列程序的运行结果是:

#include<stdio.h>
int main(void){
  int a=5, b=6, result=0;
  result=(a>b)?(a>>1):(b<<1);
  printf("result=%d\n", result);
  return 0;
}
10 / 12

"右移"运算符(>>)

"右移"运算符用于将一个数的各二进制位全部右移若干位,低位右移后舍弃,高位补符号位(对于有符号数)或补0(对于无符号数)。

规则:右移n位相当于除以2的n次方(对于正数)

"右移"的用途:

  • 快速除法:右移n位相当于除以2的n次方(对于正数)
  • 提取高位:用于提取数据的高位部分
// 右移示例
int a = 20; // 二进制: 00010100
int b = a >> 2; // 结果: 00000101 (十进制5)

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);
}

11 / 12

"取反"运算符(~)第二节课讲

"取反"运算符是一个单目运算符,用于对一个二进制数按位取反,即将0变为1,1变为0。

规则:~0 = 1, ~1 = 0

"取反"的用途:

  • 求补码:与加法结合使用可以求一个数的补码
  • 创建掩码:用于创建位掩码
// 取反示例
unsigned char a = 5; // 二进制: 00000101
unsigned char b = ~a; // 结果: 11111010 (十进制250)

练习3:下列程序的运行结果为:

#include<stdio.h>
main(){
  int a=15;
  printf("%d", ~a);
}

答案:-16

解析:15的二进制是00001111,取反后得到11110000,在补码表示中这是-16。

9 / 12

课堂小结

  • 回顾位运算的六种运算符及其规则
  • 强调位运算与逻辑运算的区别
  • 总结位运算的实际应用场景
  • 提醒注意负数的补码表示

重要提醒:

1. 位运算直接操作二进制位,效率高

2. 注意负数的补码表示形式

3. 区分位运算(&,|,^)和逻辑运算(&&,||,

4. 掌握位运算的优先级和结合性

12 / 12