poj3748 位运算 bitset

位操作

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 9064   Accepted: 3626

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

ps:

自己看懂下面的bitset类模版的操作表即可

表3-7  bitset操作


b.any()


b中是否存在置为1的二进制位?


b.none()


b中不存在置为1的二进制位吗?


b.count()


b中置为1的二进制位的个数


b.size()


b中二进制位的个数


b[pos]


访问b中在pos处的二进制位


b.test(pos)


b中在pos处的二进制位是否为1?


b.set()


把b中所有二进制位都置为1


b.set(pos)


把b中在pos处的二进制位置为1


b.reset()


把b中所有二进制位都置为0


b.reset(pos)


把b中在pos处的二进制位置为0


b.flip()


把b中所有二进制位逐位取反


b.flip(pos)


把b中在pos处的二进制位取反


b.to_ulong()


用b中同样的二进制位返回一个unsigned long值


os << b


把b中的位集输出到os流

#include<stdio.h>
#include<string.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<bitset>
using namespace std;
int main(){
    int n,x,y;
    while(scanf("%x,%d,%d",&n,&x,&y)!=EOF){
       bitset<32>q(n);
       q.reset(x);
       q.set(y);
       q.set(y-1);
       q.reset(y-2);
       printf("%x\n",q.to_ulong());
    }
    return 0;
}
时间: 2024-08-09 18:56:05

poj3748 位运算 bitset的相关文章

位运算之 C 与或非异或

位运算比较易混: 位运算之 C 与或非异或 与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:~ 1取0,0取1 ~1 = 0, ~0 = 1 ~(10001) = 01110 异或运算:^ 两者相等为0,不等为1(易混淆) 1^1=0, 1^0=1, 0^1=1, 0^0=0 位移操作符:<&

HDU4149 Magic Potion(位运算)

题目请戳这里 题意:给出x1,x2,x3,x4,x5,x6,x7,x8与某值m进行异或运算后的结果,再给出x1~x8之和与m进行异或运算后的结果sum,求m. 思路: 根据位运算特性来做,由于m最大为32位,我们可以从最低位依次来推理得到,用x>>i&1来取右数第i-1位的值. 假设二进制右起第一位是1,算出所有xi的右起第一位二进制结果,累加得到tmp,比较tmp与sum的最右位,符合则m最右位为1,否则为0: 于是x1~x8的二进制最右位已求出,累加求进位依次类推. 很有意思的一道

N皇后问题(位运算实现)

本文参考Matrix67的位运算相关的博文. 顺道列出Matrix67的位运算及其使用技巧 (一) (二) (三) (四),很不错的文章,非常值得一看. 主要就其中的N皇后问题,给出C++位运算实现版本以及注释分析. 皇后问题很经典,就不再赘述问题本身,解决皇后问题,一般采用的都是深搜DFS+回溯的方法,按照行(列)的顺序枚举每一个可以放置的情况,然后进行冲突判断,当前的放置是否合法,合法就继续搜索下一层,不合法就搜索就回溯.直到,找到一个合法的解,每一层都有一个皇后并且不发生冲突,这时候,放置

Matlab位运算笔记

本文为转载其他地方的文章; MATLAB函数 1.matlab函数bitset 设置数的某一位二进制位为1. <Simulink与信号处理> 使用方法 C = bitset(A,bit) 将数A的第bit二进制位设为1. C = bitset(A,bit,V) <Simulink与信号处理> 将数A的第bit二进制位设为V,V必须为0或1. 应用举例 例1: . C = bitset(uint8(9),5) C = 25 将数字9(01001)的第5位设为1,C的二进制位11001

位运算大集合

一.位运算常用的小技巧:判断奇偶.交换两数.变换符号及求绝对值等 1.判断奇偶 只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数.因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数. 下面程序将输出0到100之间的所有奇数. 1 for (i = 0; i < 100; ++i) 2 if (i & 1) 3 printf("%d ", i); 4 putchar('\n'); 2.交换两数 一般的写法是:

位运算的另一种姿势

在蒟蒻Cydiater日常水题的过程中,忽然遇到了一道题.中间有一个过程是要求在很快的时间内求出$1500$大小的两个01串的与之后存在多少个1. 最坏的,扫一遍,整体复杂度$O(N)$,好像没有什么可以优化的空间了QAQ.我开始考虑用位运算的与操作优化,因为其有$1500$个元素,所以可以考虑把这个东西拆成$\frac{N}{32}$个01串. 但是这之后好像就又存在一个问题.如何快速的统计一个二进制的01串里有多少个1?如果不要求$O(1)$,可以不停的统计lowbit,那么这个复杂度就和有

位运算及其应用实例(1)

摘要 位运算是C/C++中的基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生的运算——大多数程序员很少使用位运算.本篇先简要介绍基本的位运算操作符及其用法(何时使用),然后介绍位运算符的几个典型应用: (1)      三种不用临时变量交换两个整数的实例,并分析每个实例的优缺点 (2)      进制转换,通过位运算实现将十进制数按二进制和十六进制输出,并得出一个通用的,用于将十进制按照2的n次方进制输出的程序. (3)      给出利用位运算实现的计算整数的二进制表示中有多少个1

计算机中的位运算

位运算是C/C++中的基本运算之一,即便是这样,它对大多数程序员来说是一个比较陌生的运算——大多数程序员很少使用位运算.本篇先简要介绍基本的位运算操作符及其用法(何时使用),然后介绍位运算符的几个典型应用: (1)      三种不用临时变量交换两个整数的实例,并分析每个实例的优缺点 (2)      进制转换,通过位运算实现将十进制数按二进制和十六进制输出,并得出一个通用的,用于将十进制按照2的n次方进制输出的程序. (3)      给出利用位运算实现的计算整数的二进制表示中有多少个1的实例

N皇后 八皇后 位运算解法

问题描述 什么是八皇后? 题目链接 N皇后 解法 ? 直接在N*N的棋盘上进行深搜,试探着下棋,也就是回溯法. ? 对于一个皇后来说,我们需要判断她的 八个方向 ,即 主对角线,副对角线,行,列 ? 1. 确定状态 ? 第一眼的感觉是要用 四个数组来储存情况,但时间上只需要三个 ,把 行 排除在外 ? 因为每次搜索的时候,都自动按行搜索,也就是变量 row ,每改变一次,代表了不同的行 ? 接下来,分析主对角线 ,对于N*N的矩阵来说,主对角线上的值满足 行和列的差为定值 ? 即,做减法得到的下