题目描述
假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第Y位开始的连续三位设置成110(从高位到低位的顺序),而其他位保持不变。对给定的寄存器值R,及X,Y,编程计算更改后的寄存器值R。
输入
每组数据一行,包括R,X,Y,以逗号","分隔,R为16进制表示的32位整数,X,Y在0-31之间且Y>=3,(Y-X)的绝对值>=3,保证两次置位不会重合
处理到EOF为止
输出
每组数据输出更改后的寄存器值R(16进制输出)
样例输入
12345678,0,3
样例输出
1234567c
分析:
此题考察位操作,还有要对高位和低位的概念理解到位。
#include"stdio.h"
#include"string.h"
int main()
{
int R,X,Y;
int a[32];
int s,i,k,j;
int z,mark;
char b[17]= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
while(~scanf("%x,%d,%d",&R,&X,&Y))
{
//printf("%d\n",R);
memset(a,0,sizeof(a));
s=0;
i=0;
while(R!=0)
{
a[i++]=R%2;
R=R/2;
}
a[X]=0;
a[Y]=1;
a[Y-1]=1;
a[Y-2]=0;
// for(j=0;j<i;j++)
// printf("%d",a[j]);
//printf("%lld\n",s);
s=0;
for(i=0; i<32; i++)
{
s=s+a[i]*pow(2,i);
}
printf("%x\n",s);
}
}