课程
996 字
约 3 分钟
大一上
分组作业 01:字节位操作算法设计与实现
计算机科学导论exercises/group_assignments·更新于 2026-09-15
分组作业 01:字节位操作算法设计与实现
本报告记录了小组关于二进制字节特定位检测与修改算法的设计、推导与代码实现。
一、 课程作业基本信息
| 项目名称 | 详细信息 |
|---|---|
| 课程名称 | 计算机科学导论 |
| 小组名称 | 败犬女组 |
| 组长姓名 | 八奈见杏菜 |
| 小组成员 | Kisara,Kaguya |
| 题目名称 | 分组作业1:字节位操作算法 |
| 指导教师 | 张瑾 |
| 提交日期 | 2023年11月06日 |
二、 题目描述
- 问题 1:如何判断一个字节中第 位为
1还是0? - 问题 2:如何将一个字节中第 位设为
1或0? - 问题 3:如何将一个字节中的多个位设为
1或0?
三、 解题思路
- 问题 1 思路:
- 接收一个字节和需要判断的位位置 (从
0到7); - 使用按位与运算符
&将字节与掩码(1 << i)进行按位与操作; - 若运算结果不为
0,则该位为1,否则为0。
- 接收一个字节和需要判断的位位置 (从
- 问题 2 思路:
- 接收一个字节、位位置 以及目标设置值
v(true/false或1/0); - 若目标值为
1,使用按位或赋值操作byte |= (1 << i)将第 位置为1; - 若目标值为
0,使用按位与和按位取反结合操作byte &= ~(1 << i)将第 位置为0。
- 接收一个字节、位位置 以及目标设置值
- 问题 3 思路:
- 接收一个字节、包含多个位位置的列表以及目标设置值;
- 遍历所有待修改的位置,依次应用问题 2 中的按位掩码设置算法进行批量更新。
四、 源代码实现 (C++)
#include <iostream>
#include <bitset>
using namespace std;
// 问题 1:判断第 i 位是否为 1
bool getBit(unsigned char byte, int position) {
return ((byte & (1 << position)) != 0);
}
// 问题 2:设置第 position 位为 1 或 0
void setBit(unsigned char &byte, int position, bool value) {
if (value) {
byte |= (1 << position); // 将第 position 位置 1
} else {
byte &= ~(1 << position); // 将第 position 位置 0
}
}
// 问题 3:将多个指定位设置为相同值
void setMultipleBits(unsigned char &byte, const int positions[], int count, bool value) {
for (int i = 0; i < count; i++) {
setBit(byte, positions[i], value);
}
}
int main() {
unsigned char byte = 0b10001111; // 初始二进制字节 (143)
cout << "初始字节二进制表示: " << bitset<8>(byte) << endl;
// 测试问题 1
int testPos = 3;
cout << "第 " << testPos << " 位是否为 1: " << (getBit(byte, testPos) ? "是" : "否") << endl;
// 测试问题 2
setBit(byte, 3, true);
cout << "修改第 3 位为 1 后: " << bitset<8>(byte) << endl;
// 测试问题 3
int multiPositions[] = {0, 1, 2};
setMultipleBits(byte, multiPositions, 3, false);
cout << "将第 0,1,2 位批量置 0 后: " << bitset<8>(byte) << endl;
return 0;
}
五、 成员分工
- Kisara:负责算法逻辑设计、C++ 核心代码编写与程序测试。
- Kaguya:负责流程图绘制、掩码数学逻辑校验。
- 八奈见杏菜:负责文档排版与代码注释整理。













