1. 程式人生 > >位操作(JSU-ZJJ)

位操作(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);
    }
}