题目:输入一个整数a,再输入两个整数p1,p2(p1,p2<32),输出该整数的二进制表示方法中从右端开始的p1到p2位.
题中处理的是int型变量
从右端开始,输出p1(>=0)位到p2位(<=31)的二进制位
具体的解释已在代码注释中,不懂可以评论区留言,看到后会及时回复
#include <stdio.h>
#include <stdlib.h>
void b_number(int n, int r_start, int r_end); //二进制位打印函数
int main()
{
int n;
int r_start, r_end; //开始位,结束位
printf("从右往左输出输入的数的二进制位\n");
printf("start and end from 0 to 31\n");
printf("Please input three numbers as a space separated.\n");
printf("输入的数 起始位(右) 结束位(右)\n");
scanf("%d %d %d", &n, &r_start, &r_end);
if (r_start < 0 || r_end > 31) //判断,若输入的开始位结束位值不符合要求,则直接退出程序
{
fprintf(stderr, "输入的数有误!\n");
exit(EXIT_FAILURE);
}
printf("%d = 0b", n);
b_number(n, r_start, r_end);
return 0;
}
void b_number(int n, int r_start, int r_end)
{
int flag = 1; //flag赋值1
int i; //循环次数
for (i = r_end; i >= r_start; i--) //从高位开始(p2位)开始输出
{
flag = flag << i; //flag最低位的1移位到相应的位置
if (flag & n) //通过与运算判断是否为1,并输出结果
printf("1");
else
printf("0");
flag = 1;
}
printf("\n");
}