这个东西看起来很棒棒的样子呀

bitset存储二进制数位

bitset就像一个bool类型的数组一样

bitset中的每个元素都能单独被访问

整数类型和布尔数组都能转化成bitset

有关Bitset的定义,运算以及相关的函数详见dalao的博客

https://www.cnblogs.com/RabbitHu/p/bitset.html

我将在文章的结尾摘抄这些内容用于整理板子

使用这个在处理二进制形式的数据的时候会非常方便

我个人的理解就是把二进制数当成十进制数来用的一种强力的数据结构

而且占用的空间很小,差不多逻辑满足了内存中的空间分布

其实换个角度来说,这个东西也没用

因为十进制数+位运算就直接相当于这个东西了

只不过它更加形象和直白并配备了一些函数不用自己写了而已

==================================================================================

bitset存储二进制数位。

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

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

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

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

定义一个bitset

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

输出结果:

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

bitset的运算

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

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

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

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

本文作者:胡小兔 
博客地址:http://rabbithu.cnblogs.com

数据结构:Bitset的更多相关文章

  1. hiho147周 - 数据结构 bitset

    题目链接 n个5维数,对于每个数,输出小于他的数的个数(每个维度都比他小); #include <cstdio> #include <cstring> #include < ...

  2. 疯狂位图之——位图实现12GB无重复大整数集排序

    <Programming Pearls>(编程珠玑)第一章讲述了如何用位图排序无重复的数据集,整个思想很简洁,今天实践了下. 一.主要思想 位图排序的思想就是在内存中申请一块连续的空间作为 ...

  3. 简化布隆过滤器——BitMap

    简化布隆过滤器--BitMap 前言 前段开发项目试就发现,一部分的代码实现存在着一些性能上的隐患.但当时忙于赶进度和由于卡发中的不稳定因素,想了许多解决方案也没有机会实施.最近,正好趁个机会进行一系 ...

  4. BZOJ NOIP提高组十连测第一场

    今天的题目一共拿了$180$分,感觉自己还是太菜了,二三两题只能骗到部分分 1.$String\ Master$ 题目大意:有两个字符串,在允许k次失配的情况下,求最长公共子串的长度 没什么好讲,直接 ...

  5. 谁手握账本?趣讲 ZK 的内存模型

    本文作者:HelloGitHub-老荀 Hi,这里是 HelloGitHub 推出的 HelloZooKeeper 系列,免费开源.有趣.入门级的 ZooKeeper 教程,面向有编程基础的新手. 本 ...

  6. lucene底层数据结构——底层filter bitset原理,时间序列数据压缩将同一时间数据压缩为一行

    如何联合索引查询? 所以给定查询过滤条件 age=18 的过程就是先从term index找到18在term dictionary的大概位置,然后再从term dictionary里精确地找到18这个 ...

  7. Java数据结构: java.util.BitSet源码学习

    接着上一篇Blog:一道面试题与Java位操作 和 BitSet 库的使用,分析下Java源码中BitSet类的源码. 位图(Bitmap),即位(Bit)的集合,是一种常用的数据结构,可用于记录大量 ...

  8. 位集合(BitSet)| Java数据结构

    Java Bitset类 BitSet使用示例: import java.util.BitSet; public class BitSetDemo { public static void main( ...

  9. 数据结构之(HDU2051 Bitset)

    Problem Description Give you a number on base ten,you should output it on base two.(0 < n < 10 ...

随机推荐

  1. POJ 3487 The Stable Marriage Problem(稳定婚姻问题 模版题)

    Description The stable marriage problem consists of matching members of two different sets according ...

  2. 左值&右值

    一.引子 我们所谓的左值.右值,正确的说法应该是左值表达式.右值表达式. 因为C++的表达式不是左值就是右值. 在C中,左值指的是既能够出现在等号左边也能出现在等号右边的表达式,右值指的则是只能出现在 ...

  3. iOS- iOS 7 的后台多任务 (Multitasking) 对比之前的异同、具体机制、变化

    简单来说,这玩意是对开发者友好,但对设备不友好的(可能会偷偷摸摸地占用流量和电量).对用户来说,如果你带宽够,对发热不敏感的话,会得到更好的应用体验. 从 iOS 4 开始,应用就可以在退到后台后,继 ...

  4. iOS- iPad里有趣的UIPopoverController

    效果: 1.对UIPopoverController的简单概述 1.1 UIPopoverController是在iPad开发中常用的一个组件(在iPhone上不允许使用),使用非常简单   1.2 ...

  5. <Effective C++>读书摘要--Introduction

    Introduction 1.Learning the fundamentals of a programming language is one thing; learning how to des ...

  6. 3DMAX贴图无法显示

    问题描述:我在点击"将材质指定给选定对象"按钮之后,模型只是变灰了,没有显示出我贴的图. 原因是:没有显示贴图. 我的解决方案:点击材质编辑器里面的"视口中显示敏感处理材 ...

  7. 3ds Max学习日记(六)

      到了周六就不想再忙实验室的活了,于是玩了一下3ds max,第5和第6章每章都只有4个视频,于是就一起弄完了,什么网格建模,曲面建模啥的,nurbs啥的. 附上今日的劳动成果:   叉子(用长方体 ...

  8. Personal summary 个人总结

    一.请回望开学时的第一次作业,你对于软件工程课程的想象 对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强计算机专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达 ...

  9. 【week6】约跑App视频链接

    约跑视频链接发布在优酷,链接如下: http://v.youku.com/v_show/id_XMTc3NTcyNTcyNA==.html 秒拍视频连接: http://www.miaopai.com ...

  10. Jenkins系列-Jenkins修改主目录步骤说明

    在使用Jenkins做持续集成过程中,在构建很多次后发现有时在构建的时候系统提示磁盘空间不足,此时检查发现Jenkins的主目录挂载区放在了服务器根目录下,占用空间较大,此时除了对服务器的磁盘进行扩容 ...