一个常用的技巧
先看题
输入一个整数,截取它对应的二进制位中从右到左的第8-11位(最右边为第0位)。
**输入格式要求:"%d" 提示信息:"请输入一个整数:"
**输出格式要求:"它的从右开始的第11-8位为:\n" "%d "
程序运行示例如下:
请输入一个整数:2997
它的从右开始的第11-8位为:
1 0 1 1
题解:
#include<stdio.h>
int main()
{
// 处理读入
int x;
printf("请输入一个整数:");
scanf("%d", &x);
printf("该数的从右开始的第8-11位为:\n");
// 依次求对应位置上的数字
for (int i=11; i > 7; i --)
//位运算
printf("%d", x >> i & 1);
return 0;
}
// (x >> 7) & 15 后转成二进制输出也可以得到答案
// 读者可以自行思考原理
关于 x >> i & 1 的操作
每个十进制数都对应有相应的二进制表示
比如 17 的二进制表示为 10001
记从右往左依次为 第0位 第1位 第2位 第3位 第4位
17 >> 1 表示 10001 向右移动一位 即 1000
1000 & 1 为 0 也即 17 的二进制表示第1位为0
17 >> 4 & 1 为 1 也即 17 的二进制表示第4位为1
& 是 与运算 1 & 0 == 0 1 & 1 == 1
另一个小技巧
从上面的 >> 出发:
我们称 >> 为 右移运算符 << 为左移运算符
1 << i 可以得到 2 ^ i
即 1 变成 10 变成 100 变成 1000 ……
转换为十进制便是 1 2 4 8 ……
x >> 1 可以得到 x / 2 下取整的结果