<bitset>头文件简介

< bitset >头文件

bitset是用来存放bit位元素的,由于每个元素(0或1)只占1bit位,因而可以节约空间(相比于8bit位的bool型变量)。在c++ stl中,提供了操作位的容器,使用前包含< bitset >头文件即可。

相关操作

1.创建bitset对象

如bitset<100> b,它能容纳100位比特位,每位上的初始值为0
注意:bitset的大小在定义时确定,定义后不能修改

2.设定元素值

  • 下标法,b[i],下标i的取值从0到n-1
  • b.set(),对b中所有元素设置为1(默认为0)
  • b.reset(), 对b中所有元素设置为0
  • b.set(pos,val) 等价于 b[pos]=val
  • b.reset(pos) 等价于b[pos]=0

3.其他操作

操作功能用法
test(pos)pos位是否为1?b.test(4)
any()任意位是否为1?b.any()
none()是否没有位为1?b.none()
count()值是1的位数b.count()
size()位数b.size()
flip()翻转所有位b.flip()
flip(pos)翻转pos位b.flip(4)

同样,位运算符 & | ^ ~ << 也适用于bitset

常用以上操作来做集合运算,以减少时间常数

4.输出元素

  • 逐个输出,采用下标法:cout<< b[i];
  • 整体输出,即全部输出:cout<< b;

5.样例1

#include<bits/stdc++.h>
using namespace std;

int main()
{
    bitset<100> b;
    cout<<b;
    int n;
    cout<<endl<<"下面将十进制数转为二进制,请输入十进制数"<<endl;
    cin>>n;
    int index=0;
    while(n)
    {
        b[index++]=n%2;
        n/=2;
    }
    cout<<"二进制为"<<endl;
    for(int i=index-1;i>=0;i--){
        cout<<b[i];
    }
    return 0;
}

6.样例2

#include<bits/stdc++.h>
using namespace std;

const int maxn=30;

int main()
{
    bitset<maxn> b1,b2,b3;
    for(int i=0;i<maxn;++i){
        b1[i]=i%2;
    }
    cout<<b1<<endl<<endl;

    for(int i=0;i<maxn;++i){
        b2[i]=(i+1)%2;
    }
    cout<<b2<<endl<<endl;

    b3=b1&b2;
    cout<<b3<<endl<<endl;

    b3=b3.flip();
    cout<<b3<<endl<<endl;

    b3=b1^b3;
    cout<<b3<<endl<<endl;
    return 0;
}

截图
Markdown


LeetCode 190 Reverse Bits

题目大意

reverse bits of a given 32 bits unsigned interger

For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000).

思路

bitset存

代码示例

#include<iostream>
#include<bitset>
#include<math.h>
using namespace std;

const int maxn=40;

int main()
{
    bitset<maxn> b;
    int n;
    while(cin>>n)
    {
        int index=0;
        while(n)
        {
            b[index++]=n%2;
            n/=2;
        }
        unsigned int sum=0;
        int k=31;
        for(int i=0;i<index;++i){
            sum+=b[i]*(int)pow(2,k);
            k--;
        }
        cout<<sum<<endl;
    }
    return 0;
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值