题目

从标准输入读入一个非负整数 n 和一个非负整数 k,取出并输出该整数二进制补码表示中的第 k 位(从右往左第 0 位起算)。

输入格式:一行输入两个非负整数 n 和 k,以空格分隔。

输出格式:输出单个数字 0 或 1,表示第 k 位二进制值,末尾换行。

数据范围与约定:0 ≤ n ≤ 2×109,0 ≤ k ≤ 31。

思路与算法

1. 逻辑右移对齐
将目标数逻辑右移 k 位:n >> k,将第 k 位数字移到最低位。

2. 提取最低位
与 1 进行按位与操作:(n >> k) & 1,只保留最低位,其余高位清零,得出 0 或 1。

完整程序

#include <stdio.h>

int main(void)
{
    unsigned n;
    int k;
    if (scanf("%u %d", &n, &k) != 2 || k < 0 || k >= 32) {
        return 1;
    }

    // 获取第 k 位状态:右移 k 位后与 1 按位与
    printf("%u\n", (n >> k) & 1u);
    return 0;
}

运行示例

输入:

13 3

输出:

1