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 }
时间: 2024-11-05 17:32:13

poj 3748 位操作的相关文章

POJ 3748:位操作

位操作 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,以逗号","

20160402_C语言位操作符的使用

C语言的设计具备了汇编语言的运算能力,它支持全部的位操作符. 位操作符是对字节或字中的位进行测试.置位或移位处理,在对微处理器的编程中,特别适合对寄存器.I/O端口进行操作. 6种位操作符: (1) & :按位“与”——仅当两个操作数为1时,结果为1,否则为0.如:1000 1000  & 1000 0001  = 1000 0000: (2) | :按位“或”——仅当两个操作数为0时,结果为0,否则为1.如:1000 1000 | 1000 0001 = 1000 1001: (3) ^

POJ 2115 (模线性方程 -&gt; 扩展欧几里得)

题意: for(i=A ; i!=B ;i +=C)循环语句,问在k位操作系统中循环结束次数. 若在有则输出循环次数. 否则输出死循环. 存在这样的情况:i= 65533 :i<=2:i+= 4:时i = 2: 由模线性方程->扩展欧几里得 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> using

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

poj 2777 Count Color (线段树区间更新)

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37647   Accepted: 11315 Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.

POJ 2229(Sumsets)

题目链接:http://poj.org/problem?id=2229 思路:“动态规划”问题 只需要列三个连续数字N即可发现:1.N为奇数时,f(n)=f(n-1)    2.N为偶数时,f(n)=f(n-1)+f(n/2)   因为此时N-1为基数,N-1情况的每一行第一个数一定是1,所以加上一个1时,就相当于在前面直接加一个1或者与 “后面” 的1组成2. ac代码: #include <iostream> #include <algorithm> #include <

POJ - 3186 Treats for the Cows (区间DP)

题目链接:http://poj.org/problem?id=3186 题意:给定一组序列,取n次,每次可以取序列最前面的数或最后面的数,第n次出来就乘n,然后求和的最大值. 题解:用dp[i][j]表示i~j区间和的最大值,然后根据这个状态可以从删前和删后转移过来,推出状态转移方程: dp[i][j]=max(dp[i+1][j]+value[i]*k,dp[i][j-1]+value[j]*k) 1 #include <iostream> 2 #include <algorithm&

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)

POJ——T2271 Guardian of Decency

http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5932   Accepted: 2463 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is