题目
从标准输入读入一个整数 n、操作类型 op(1 表示置 1,0 表示清 0)以及位数 k,对整数第 k 位二进制执行置位或清零操作,输出修改后的新整数。
输入格式:一行输入三个整数 n op k,以空格分隔。
输出格式:输出操作后的新整数,末尾换行。
数据范围与约定:0 ≤ k ≤ 30,op 取值为 0 或 1。
思路与算法
1. 指定位置 1(按位或掩码)
构造掩码 1 << k,执行 n | (1 << k)。目标位无论原先是 0 还是 1,与 1 或运算后必为 1。
2. 指定位清 0(按位与取反掩码)
掩码取反 ~(1 << k) 使只有第 k 位为 0 其余位全为 1,执行 n & ~(1 << k) 强制清零该位。
完整程序
#include <stdio.h>
int main(void)
{
unsigned n;
int k, op;
if (scanf("%u %d %d", &n, &k, &op) != 3 || k < 0 || k >= 32) {
return 1;
}
// 构造第 k 位的掩码(仅第 k 位为 1,其余位为 0)
unsigned mask = 1u << k;
if (op == 1) {
// 置 1 操作:按位或运算
n |= mask;
} else {
// 清 0 操作:与掩码的反码按位与
n &= ~mask;
}
printf("%u\n", n);
return 0;
}运行示例
输入:
8 1 1输出:
10