位操作(JSU-ZJJ)

题目描述

假设你工作在一个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);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43506138/article/details/84941010