一个常用的技巧

先看题

输入一个整数,截取它对应的二进制位中从右到左的第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 下取整的结果