位操作
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8856 | Accepted: 3535 |
Description
假设你工作在一个32位的机器上,你需要将某一个外设寄存器的第X位设置成0(最低位为第0位,最高位为第31位),将第Y位开始的连续三位设置成110(从高位到低位的顺序),而其他位保持不变。对给定的寄存器值R,及X,Y,编程计算更改后的寄存器值R。
Input
仅一行,包括R,X,Y,以逗号","分隔,R为16进制表示的32位整数,X,Y在0-31之间且Y>=3,(Y-X)的绝对值>=3,保证两次置位不会重合
Output
更改后的寄存器值R(16进制输出)
Sample Input
12345678,0,3
Sample Output
1234567c
Source
做法一:
C++标准库:bitset 用法整理 :
1 #include2 #include 3 #include 4 #include 5 #include //二进制类,bit位,初始为0 6 using namespace std; 7 int main(){ 8 int r,x,y; 9 while(scanf("%x,%d,%d",&r,&x,&y)==3){ //输入16进制数10 bitset<32> b(r);11 b.reset(x);12 b.set(y);13 b.set(y-1);14 b.reset(y-2);15 printf("%x\n",b.to_ulong());//将二进制转换为unsign long数值16 }17 return 0;18 }
做法二:
模拟
1 #include2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int bit[32]; 8 int main(){ 9 int r,x,y;10 while(scanf("%x,%d,%d",&r,&x,&y)==3){11 memset(bit,false,sizeof(bit));12 int i=0;13 for(;i<32;i++){14 bit[i]=r&1;15 r=r>>1; 16 }17 bit[x]=0;18 bit[y]=1;19 bit[y-1]=1;20 bit[y-2]=0;21 for(i=31;i>=0;i--){22 r=r<<1;23 r=r|bit[i];24 }25 printf("%x\n",r);26 }27 return 0;28 }