0%

bitset

在某些题有奇效

bitset

1 Bitset 的构造函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//1.默认构造函数 :0
bitset<10> a; //a:0000000000

//2.用一个数值初始化

(1)当用一个数值去构造的时候,其实就是将数值在内存中的存储方式显示出来。(数值在内存中是以补码形式存储的)
(2)若bitset的位数n小于数值的位数,只取数值(小端的)前n位初始化给bitset

bitset<4> a(-16); //-16的补码为11111111.....10000,a有4位,因此a:0000

bitset<5> a(17); //17的补码为00000000.....10001,a有5位,因此a:10001

bitset<6> a(-8); //-8的补码为 11111111.....11000,a有6位,因此a:111000

bitset<7> a(8); //8的补码为 00000000.....01000,a有7位,因此a:0001000

//3.用字符串string 或者 char[]初始化

//以string为例,char[]与其用法相同

string b = "100101111"; //这里特别注意,bitset的size和字符串长度不匹配的时候如何构造

bitset<3> a(b); //a:100 //当bitset的size小于等于字符串长度,取字符串的前size位

bitset<6> a(b); //a:100101

bitset<9> a(b); //a:100101111

bitset<12> a(b); //a:000100101111 //当bitset的size大于字符串长度,进行补零

运算符重载[], 支持下标从 0 开始访问, 与数组类似

注意 : 下标小的是小端

1
2
3
4
5
6
7
8
bitset<4> a;	//a:0000(默认构造函数)
a[0] = 1;
a[2] = 1;
//a:0101

bitset<7> b("1001101");
for (int i = 0; i < 7; i++)
cout << b[i] << ' ';//输出:1011001

2 Bitset 的成员函数:

count size test any none all set reset flip to_string( ) to_ulong( ) to_ullong( ) 等。

  • count 返回 bitset 中 1 的个数
  • size 返回 size 大小
  • test 返回某一位 (下标)是否为 1
    1
    2
    3
    4
    5
    6
    7
    //成员函数声明
    bool test (size_t pos) const;
    //用例:
    bitset<6> a("011101");
    cout << a.test(0) << endl; //1 (true)
    cout << a.test(1) << endl; //0 (false)
    cout << a.test(5) << endl; //0 (false)
  • any 只要有一位是 1, 就返回 true, 否则返回 false
  • none 若全为 0, 返回 true, 否则返回 false
    1
    2
    3
    4
    5
    //成员函数声明
    bool none() const;
    //用例:
    cout << bitset<4>("0000").none() << endl; //1 (true)
    cout << bitset<4>("0001").none() << endl; //0 (false)
  • all 若全为 1, 返回 true, 否则返回 false
    1
    2
    3
    4
    5
    //成员函数声明
    bool all() const noexcept;
    //用例:
    cout << bitset<4>("1111").all() << endl; //1 (true)
    cout << bitset<4>("1101").all() << endl; //0 (false)
  • set 全部置 1, 或者某一位置 1 或 0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //成员函数声明
    bitset& set() noexcept;
    //用例:
    //1.
    bitset<6> a("011101");
    a.set();
    cout << a << endl; //输出:111111
    //2.set也可以指定参数,第一个参数是索引,第二个true表示置1,false表示置0
    bitset& set (size_t pos, bool val = true);
    //
    bitset<6> a("011101");
    a.set(0,0);
    a.set(5,1);
    cout << a << endl; //输出:111100
  • reset 全部置 0, 或者某一位置 0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    bitset& reset();
    bitset& reset (size_t pos);
    //用例:
    bitset<6> a("011101");
    a.reset();
    cout << a << endl; //输出:000000
    //也可以指定参数,单独将某一位置0
    bitset<6> a("011101");
    a.reset(0);
    cout << a << endl; //输出:011100
  • flip 全部取反, 或者某一位取反
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //成员函数声明
    bitset& flip();
    bitset& flip (size_t pos);
    //用例:
    bitset<6> a("011101");
    a.flip();
    cout << a << endl; //输出:100010
    //也可以指定参数,单独将某一位取反
    bitset<6> a("011101");
    a.flip(0);
    a.flip(1);
    cout << a << endl; //输出:011110
  • to_string ( ) 转换为字符串
  • to_ulong ( ) 转换为无符号 long 类型 bitset<6> a("011101"); auto x = a.to_ulong();
  • to_ullong ( ) 转换为无符号 long long 类型 bitset<6> a("011101"); auto x = a.to_ullong();
  • 如果超出了 bitset 定义的范围:
1
2
3
4
5
6
7
8
9
10
11
bitset<2>bitset1(12);//12的二进制为1100(长度为4),但bitset1的size=2,只取后面部分,即00

string s="100101";
bitset<4> bitset2(s);//s的size=6,而bitset的size=4,只取前面部分,即1001

//char s2[]="11101";
//bitset<4> bitset3(s2);//与bitset2同理,只取前面部分,即1110

cout << bitset1 << endl;  //00
cout << bitset2 << endl;  //1001
//cout << bitset3 << endl;  //1110

3 位运算操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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; // 0001 (右移,不赋值)
cout << (foo==bar) << endl; // (0)false (0110==0011为false)
cout << (foo!=bar) << endl; // (1)true (0110!=0011为true)
cout << (foo&bar) << endl; // 0010 (按位与,不赋值)
cout << (foo|bar) << endl; // 0111 (按位或,不赋值)
cout << (foo^bar) << endl; // 0101 (按位异或,不赋值)
  • 本文作者: FXJFXJ
  • 本文链接: https://fxj.wiki/posts/9dd4d1cb/
  • 版权声明: 本博客所有文章除特别声明外,均采用 ZERO 许可协议。转载请注明出处!