题目1:从键盘上输入1个正整数给int变量num,输出由8~11位构成的数(从低0号开始编号)
基本思路:
1.截取8~11位的数,位移到0~3位
a)构建8~11位上为1其余为0的数
b)位与输入数
c)得到的结果右移8位
2.先将8~11位移到0~3位,截取0~3位
a)输入数右移8位
b)构建0~3位为1其余为0的数
c)位与,得到结果
仔细考察构建的辅助数(位与时用到的数,因为起到了“采用某些位,无视,即屏蔽其他位”的左右,所以也叫做mask),
构建mask的复杂程度,这里采用方案2
main()
{
int num, mask;
printf("Input a integer number: ");
scanf("%d",&num);
/*将num右移8位,将8~11位移到低4位上*/
num >>= 8;
/*间接构造1个低4位为1、其余各位为0的整数*/
mask = ~ ( ~0 << 4);
//打印结果
printf("result=0x%x\n", num & mask);
}
程序运行情况:
Input a integer number:1000 ←┘
result=0x3
程序说明:~ ( ~0 << 4)
按位取0的反,为全1;左移4位后,其低4位为0,其余各位为1;
再按位取反,则其低4位为1,其余各位为0。这个整数正是我们所需要的。
题目2:从键盘上输入1个正整数给int变量num,按二进制位输出该数。
思路:即将整数从31位到第0位依次输出。如果是高电平输出字符1,否则输出0。
方案1,掩码(mask)变动,原整数不动
a)构建掩码1<<31(31这个数值是否合适?)
b)位与正整数,能得到原整数第31位上的值
c)构建掩码1<<30,用来得到30位上的情况
d)循环
方案2,原整数变动,掩码不动
a)构建掩码1<<sizeof(int)-1(这里优先级有没有问题?)
b)位与正整数,能得到原整数第31位上的值
c)将原整数左移一位,那么再与mask位与的结果就是原整数的第30位的值
d)循环
#include "stdio.h"
main()
{
int num, mask, i;
printf("Input a integer number: ");
scanf("%d",&num);
/*构造1个最高位为1、其余各位为0的整数(屏蔽字)*/
mask = (1<<sizeof(int) – 1);
printf("%d=" , num);
for(i=1; i<= sizeof(int); i++)
{
putchar(num&mask ? ’1’ : ‘0’); /*输出最高位的值(1/0)*/
num <<= 1; /*将次高位移到最高位上*/
if( i%4==0 ) putchar(‘,’); /*四位一组,用逗号分开*/
}
printf("\bB\n");
}
程序运行情况:
Input a integer number:1000
1000=0000,0011,1110,1000B