C++ bitset——高端压位卡常题必备STL

以下内容翻译自cplusplus.com,极大地锻炼了我的英语能力。

bitset存储二进制数位。

bitset就像一个bool类型的数组一样,但是有空间优化——bitset中的一个元素一般只占1 bit,相当于一个char元素所占空间的八分之一。

bitset中的每个元素都能单独被访问,例如对于一个叫做foo的bitset,表达式foo[3]访问了它的第4个元素,就像数组一样。

bitset有一个特性:整数类型和布尔数组都能转化成bitset。

bitset的大小在编译时就需要确定。如果你想要不确定长度的bitset,请使用(奇葩的)vector。

定义一个bitset

// constructing bitsets

  1. #include <iostream> // std::cout
  2. #include <string> // std::string
  3. #include <bitset> // std::bitset
  4. int main ()
  5. {
  6. std::bitset<16> foo;
  7. std::bitset<16> bar (0xfa2);
  8. std::bitset<16> baz (std::string("0101111001"));
  9. std::cout << "foo: " << foo << '\n';
  10. std::cout << "bar: " << bar << '\n';
  11. std::cout << "baz: " << baz << '\n';
  12. return 0;
  13. }

输出结果:

  1. foo: 0000000000000000
  2. bar: 0000111110100010
  3. baz: 0000000101111001

bitset的运算

bitset的运算就像一个普通的整数一样,可以进行与(&)、或(|)、异或(^)、左移(<<)、右移(>>)等操作。

// bitset operators

include // std::cout

include // std::string

include // std::bitset

  1. int main ()
  2. {
  3. std::bitset<4> foo (std::string("1001"));
  4. std::bitset<4> bar (std::string("0011"));
  5. std::cout << (foo^=bar) << '\n'; // 1010 (XOR,assign)
  6. std::cout << (foo&=bar) << '\n'; // 0010 (AND,assign)
  7. std::cout << (foo|=bar) << '\n'; // 0011 (OR,assign)
  8. std::cout << (foo<<=2) << '\n'; // 1100 (SHL,assign)
  9. std::cout << (foo>>=1) << '\n'; // 0110 (SHR,assign)
  10. std::cout << (~bar) << '\n'; // 1100 (NOT)
  11. std::cout << (bar<<1) << '\n'; // 0110 (SHL)
  12. std::cout << (bar>>1) << '\n'; // 0001 (SHR)
  13. std::cout << (foo==bar) << '\n'; // false (0110==0011)
  14. std::cout << (foo!=bar) << '\n'; // true (0110!=0011)
  15. std::cout << (foo&bar) << '\n'; // 0010
  16. std::cout << (foo|bar) << '\n'; // 0111
  17. std::cout << (foo^bar) << '\n'; // 0101
  18. return 0;
  19. }

上面代码的输出结果见注释。(注意,这段代码涉及赋值操作)

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的结果

biiset用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. 一步一步手写GIS开源项目-(1)500行代码实现基础GIS展示功能

    1.开篇 大学毕业工作已经两年了,上学那会就很想研读一份开源GIS的源码,苦于自己知识和理解有限,而市面上也没有什么由浅入深讲解开源gis原理的书籍,大多都是开源项目简介以及项目的简单应用.对于初级程 ...

  2. 快速生成html文本文档——typora

    下载地址:https://www.typora.io/#windows 一.工具界面: 二.使用工具编辑: 三.导出为html: 四.打开html查看: Markdown语法教程:https://ww ...

  3. oracle 触发器的实例(转)

    触发器使用教程和命名规范 目  录 目录 触发器使用教程和命名规范 1 1,触发器简介 1 2,触发器示例 2 3,触发器语法和功能 3 4,例一:行级触发器之一 4 5,例二:行级触发器之二 4 6 ...

  4. 【转载】C#中List集合使用Exists方法判断是否存在符合条件的元素对象

    在C#的List集合操作中,有时候需要根据条件判断List集合中是否存在符合条件的元素对象,此时就可以使用List集合的扩展方法Exists方法来实现,Exists方法的签名为bool Exists( ...

  5. SSRF绕过IP限制方法总结

    SSRF绕过IP限制方法总结 - Summary of SSRF methods for bypassing IP restrictions -https://www.cnblogs.com/iAmS ...

  6. Python简单实现在线更新下载

    Python简单实现 软件在线更新 在线下载(Python simple implementation of software online update and download) 文章来自:htt ...

  7. 修改redhat7默认显示语言从中文为英文

    [delmore@localhost Desktop]$ su                               //切换到最高权限 Password:                    ...

  8. Java经典逻辑编程50题 (转)

    注: 转自https://blog.csdn.net/Alias_fa/article/details/52985112  (摘了题目部分和部分分析,想看原作代码的见原作链接) [程序1] 題目:古典 ...

  9. Nginx 配置 HTTPS(多域名)

    平常开发要求比较低, 依然在用 HTTP, 但到了微信小程序就不行了, 腾讯和苹果都对 API 提出了 HTTPS 的要求. 尤其是苹果, 不仅要求 HTTPS, 还要求 TLS 协议版本要在 1.2 ...

  10. docker入门一:docker安装(在线跟离线)

    一.在线安装 1.安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 2.添加软件源 yum-config-manager ...