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