c++ bitse用法

c++ bitse用法

bitset类似于数组结构,但是它的每一个元素之能是0或1,每个元素仅用1bit空间。
应用是须加入#include <bitset>

0. 引子

Determine if all characters of a string are unique.

模式识别:凡是题目中涉及unique的字眼或者是否存在直觉考虑用bitset。


bool isUnique(string input) {
    bitset<256> hashMap; // 利用ADCII值作为数字下标的映射
    for (int i = 0; i < input.length(); i++) {
        if (hashMap[(int)input[i]]) {
            return false; // 如果出现相同的则返回true
        }
        hashMap[(int)input[i]] = 1;
    }
    
    return true; // true表示都是unique
}

1. 构造函数

	bitset<10> bitset1; // 无参构造,默认都是0
	bitset<10> bitset2(8); // 二进制保存,前面补0

	string s = "1001";
	bitset<10> bitset3(s);

	char s2[] = "1001";
	bitset<10> bitset4(s2);

	cout << bitset1 << endl;  // 0000000000
	cout << bitset2 << endl;  // 0000001000
	cout << bitset3 << endl;  // 0000001001
	cout << bitset4 << endl;  // 0000001001
	

注意:

  • 用字符串构造时,字符串只能是’0’ or ‘1’,否则会抛出异常;
  • 构造时,需要在<>中表明bitset的size;
  • 有参构造若二进制表示比bitset的size小,前面补0,反之则在二进制后面截断输出。

2. 可用的操作符

bitset<4> foo (string("1001"));
    bitset<4> bar (string("0011"));

    cout << (foo^=bar) << endl;       // 1010 (foo对bar按位异或后赋值给foo)
    cout << (foo&=bar) << endl;       // 0010 (按位与后赋值给foo)
    cout << (foo|=bar) << endl;       // 0011 (按位或后赋值给foo)

    cout << (foo<<=2) << endl;        // 1100 (左移2位,低位补0,有自身赋值)
    cout << (foo>>=1) << endl;        // 0110 (右移1位,高位补0,有自身赋值)

    cout << (~bar) << endl;           // 1100 (按位取反)
    cout << (bar<<1) << endl;         // 0110 (左移,不赋值)
    cout << (bar>>1) << endl;         // 0001 (右移,不赋值)

    cout << (foo==bar) << endl;       // false (0110==0011为false)
    cout << (foo!=bar) << endl;       // true  (0110!=0011为true)

    cout << (foo&bar) << endl;        // 0010 (按位与,不赋值)
    cout << (foo|bar) << endl;        // 0111 (按位或,不赋值)
    cout << (foo^bar) << endl;        // 0101 (按位异或,不赋值)

此外,可以通过 [ ] 访问元素(类似数组),注意最低位下标为0,如下:

	bitset <4> foo("1011");
	cout << foo[0] << endl; // 1
	cout << foo[1] << endl; // 1
	cout << foo[2] << endl; // 0
	cout << foo[3] << endl; // 1

3. 常用函数

bitset<8> foo("10011011");
	cout << foo.count() << endl; //5(count函数用来求bitset中1的位数,foo中共有5个1
	cout << foo.size() << endl;  //8(size函数用来求bitset的大小,一共有8位

	cout << foo.test(0) << endl; //true(test函数用来查下标处的元素是0还是1,并返回false或true,此处foo[0]为1,返回true
	cout << foo.test(2) << endl; //false(同理,foo[2]为0,返回false

	cout << foo.any() << endl;   //true (any函数检查bitset中是否有1
	cout << foo.none() << endl;  //false (none函数检查bitset中是否没有1
	cout << foo.all() << endl;   //false (all函数检查bitset中是全部为1

说明

test函数会对下标越界作出检查,而通过 [ ] 访问元素却不会经过下标检查,所以,在两种方式通用的情况下,选择test函数更安全一些

bitset<8> foo ("10011011");
cout << foo.flip(2) << endl;  //10011111  (flip函数传参数时,用于将参数位取反,本行代码将foo下标2处"反转",即0变1,1变0
cout << foo.flip() << endl;   //01100000  (flip函数不指定参数时,将bitset每一位全部取反
cout << foo.set() << endl;    //11111111  (set函数不指定参数时,将bitset的每一位全部置为1
cout << foo.set(3,0) << endl;  //11110111  (set函数指定两位参数时,将第一参数位的元素置为第二参数的值,本行对foo的操作相当于foo[3]=0
cout << foo.set(3) << endl;    //11111111  (set函数只有一个参数时,将参数下标处置为1

cout << foo.reset(4) << endl;  //11101111  (reset函数传一个参数时将参数下标处置为0
cout << foo.reset() << endl;   //00000000  (reset函数不传参数时将bitset的每一位全部置为0

转换函数

bitset<8> foo ("10011011");
    string s = foo.to_string();  //将bitset转换成string类型
    unsigned long a = foo.to_ulong();  //将bitset转换成unsigned long类型
    unsigned long long b = foo.to_ullong();  //将bitset转换成unsigned long long类型

    cout << s << endl;  //10011011
    cout << a << endl;  //155
    cout << b << endl;  //155
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子孤岛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值