poj 3748 位操作
位操作
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 用法整理 :
http://happyboy200032.blog.163.com/blog/static/46903113201291252033712/
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<iostream> 5 #include<bitset>//二进制类,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 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<iostream> 5 #include<bitset> 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 }