题目

从标准输入读入一个整数 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