位操作
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8964 | Accepted: 3581 |
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
做完这个题目AC的时候,再看其它人discuss的时候。哭的心都有了。自己竟然模拟做。。。
各种WA,RE都搞出来了。
。。受不了了。代码各种幼稚我也不优化了。。。
代码:
#include#include #include #include #include #include using namespace std;int wei[10000];void change_to(char R[10000]){ int i,j; for(i=7;i>=0;i--) { int temp=R[i]; for(j=0;j<=3;j++) { wei[(7-i)*4+j]=temp&1; temp=temp>>1; } }}void change(int x,int y){ if(x>=0&&x<=31) wei[x]=0; if(y>=2) { wei[y]=1; wei[y-1]=1; wei[y-2]=0; } else if(y==1) { wei[y]=1; wei[y-1]=1; } else wei[y]=1;}void solve(){ char temp; int i; int flag=1; for(i=31;i>=3;i=i-4) { int sum= wei[i]*8 + wei[i-1]*4 + wei[i-2]*2 + wei[i-3]; if(sum<=9 && sum>=0) { temp=sum+'0'; } else { temp=sum+87; } if(temp=='0'&&flag==1) { } else { flag=0; cout< ='0'&&R[x]<='9') R[x]=R[x]-'0'; else if(R[x]>=97) R[x]=R[x]-'a'+10; } scanf("%d,%d",&x,&y); change_to(R); change(x,y); solve(); cout<
话说位运算真是简单啊。%x真是方便啊,别总认准%d啊。
。
。
代码:
#include#include using namespace std;int main() { unsigned int r, x, y; while(scanf_s("%x,%d,%d", &r, &x, &y) == 3) { r = r & (~(1<