[STL] BITSET

Author Avatar
空気浮遊 2018年04月17日
  • 在其它设备中阅读本文章
  • 位运算
  • STL
  • bitset
  • 分享到 Facebook
  • 分享到 Telegram
  • 分享到 Twitter
  • 分享到微博

摘要

bitset<[an integer]> bs;来定义一个 bitset。
bitset 可以像整数一样进行正常的位运算。
bitset 的长度固定。
bitset 的空间进行了优化,每位占 1bit。

bitset 的定义

// constructing bitsets
#include <iostream>       // std::cout
#include <string>         // std::string
#include <bitset>         // std::bitset

int main ()
{
  std::bitset<16> foo;
  std::bitset<16> bar (0xfa2);
  std::bitset<16> baz (std::string("0101111001"));

  std::cout << "foo: " << foo << '\n';
  std::cout << "bar: " << bar << '\n';
  std::cout << "baz: " << baz << '\n';

  return 0;
}

bitset 的相关函数

对于一个叫做 foo 的 bitset:
foo.size() 返回大小(位数)
foo.count() 返回 1 的个数
foo.any() 返回是否有 1
foo.none() 返回是否没有 1
foo.set() 全都变成 1
foo.set(p) 将第 p + 1 位变成 1
foo.set(p, x) 将第 p + 1 位变成 x
foo.reset() 全都变成 0
foo.reset(p) 将第 p + 1 位变成 0
foo.flip() 全都取反
foo.flip(p) 将第 p + 1 位取反
foo.to_ulong() 返回它转换为 unsigned long 的结果,如果超出范围则报错
foo.to_ullong() 返回它转换为 unsigned long long 的结果,如果超出范围则报错
foo.to_string() 返回它转换为 string 的结果

使用 bitset 来进行加法

即使用位运算来代替加法
假设有x+y
则carry=(x&y)<<1为该加法的进位结果
sum=x^y为该加法的非进位结果
显然carry+sum=x+y
则再对 carry 和 sum 进行重复操作
直到carry=0。

Code

bs operator + (bs a, bs b) {
    bs sum=a;
    bs carry=b;
    bs tmps;
    while(carry.any()) {
        tmps=sum;
        sum=tmps^carry; // 求非进位结果
        carry=(tmps&carry)<<1; // 求进位结果(两个相加等于最终结果)
    }
    return sum; // 进位结果等于0时,结束。
}

关于位运算时间复杂度

是个玄学。由于底层优化,初步推断接近 $O(1)$。可以应付 1e7 左右级别的修改操作?(由某题得出的结论,如果那题数据不水...)
然而常数还是比较大,因此慎用。


更正:复杂度一般认为是 $O(\frac{n}{32})$。在 O2 下有一定优化加持。

参考文章

胡小兔 - C++ bitset——高端压位卡常题必备 STL:https://www.cnblogs.com/RabbitHu/p/bitset.html

kiven.li - 用基本位运算实现加减乘除:https://www.cnblogs.com/kiven-code/archive/2012/09/15/2686922.html

本文链接:https://pst.iorinn.moe/archives/bitset.html
许可: https://pst.iorinn.moe/license.html
若无特别说明,博客内的文章默认将采用 CC BY 4.0 许可协议 进行许可☆

      新篇
旧篇      
    • fingerprint Login
  • home 主页
  • inbox 归档
    • June 2026 1
    • December 2024 1
    • August 2024 1
    • June 2024 1
    • April 2024 3
    • March 2024 1
    • February 2024 2
    • January 2024 1
    • November 2023 1
    • August 2023 1
    • May 2023 1
    • February 2023 2
    • January 2023 2
    • July 2022 1
    • June 2022 1
    • April 2022 1
    • March 2022 1
    • February 2022 2
    • December 2021 1
    • November 2021 1
    • August 2021 3
    • July 2021 3
    • April 2021 2
    • March 2021 1
    • February 2021 4
    • January 2021 2
    • December 2020 1
    • November 2020 1
    • October 2020 3
    • September 2020 1
    • August 2020 1
    • July 2020 1
    • March 2020 1
    • December 2019 1
    • September 2019 1
    • July 2019 1
    • April 2019 2
    • March 2019 13
    • February 2019 15
    • January 2019 11
    • December 2018 3
    • November 2018 6
    • October 2018 28
    • September 2018 31
    • August 2018 18
    • July 2018 13
    • June 2018 27
    • May 2018 11
    • April 2018 12
    • March 2018 19
    • February 2018 8
    • January 2018 7
    • December 2017 2
    • November 2017 2
  • apps 分类
    • 笔记
    • 题解
    • 杂文
    • 技术
    • 游戏
    • 小说
  • 留言板
  • 关于
  • 友链
  • 文章总数 281
主题 - Material i
expand_less
Copyright © 2026 雪屋
Float in air.
Powered by Typecho
Theme - Material