基于C++ bitset常用函数及运算符(详解)

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

------------------------------------------------------------

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

bitset存储二进制数位。

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

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

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

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

定义一个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;
}

输出结果:

foo: 0000000000000000
bar: 0000111110100010
baz: 0000000101111001

bitset的运算

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

// bitset operators
#include <iostream>  // std::cout
#include <string>   // std::string
#include <bitset>   // std::bitset

int main ()
{
 std::bitset<4> foo (std::string("1001"));
 std::bitset<4> bar (std::string("0011"));

 std::cout << (foo^=bar) << '\n';  // 1010 (XOR,assign)
 std::cout << (foo&=bar) << '\n';  // 0010 (AND,assign)
 std::cout << (foo|=bar) << '\n';  // 0011 (OR,assign)

 std::cout << (foo<<=2) << '\n';  // 1100 (SHL,assign)
 std::cout << (foo>>=1) << '\n';  // 0110 (SHR,assign)

 std::cout << (~bar) << '\n';   // 1100 (NOT)
 std::cout << (bar<<1) << '\n';   // 0110 (SHL)
 std::cout << (bar>>1) << '\n';   // 0001 (SHR)

 std::cout << (foo==bar) << '\n';  // false (0110==0011)
 std::cout << (foo!=bar) << '\n';  // true (0110!=0011)

 std::cout << (foo&bar) << '\n';  // 0010
 std::cout << (foo|bar) << '\n';  // 0111
 std::cout << (foo^bar) << '\n';  // 0101

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

以上这篇基于C++ bitset常用函数及运算符(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2017-11-01

C++标准库bitset类型的简单使用方法介绍

std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位. #include<bister> using std::bitset; 一句话定义:可自定义位数,用作记录二进制的数据类型. 一,定义和初始化 bitset<n> b;                           //b有n位,每位都为0; bitset<n>

c#判断磁盘驱动器类型的两种方法介绍

1.使用WINDOWS API 复制代码 代码如下: /// <summary> /// 判断一个磁盘驱动器的类型 /// </summary> /// <param name="nDrive">包含了驱动器根目录路径的一个字串</param> /// <returns>Long,如驱动器不能识别,则返回零.如指定的目录不存在,则返回1.如执行成功,则用下述任何一个常数指定驱动器类型:DRIVE_REMOVABLE, DRIV

Bootstrap轮播插件简单使用方法介绍

本文细致的为大家分享了Bootstrap轮播插件简单实例,供大家参考,具体内容如下 使用Bootstrap的轮播插件可以向站点添加滑块,内容可以是图像,内嵌框架,视频或其它任何内容,使用轮播插件需要引入 效果图: bootstrap.min.js. <div id="carousel-example-generic" class="carousel slide" data-ride="carousel"> <!-轮播导航 --&

Android 有道词典的简单实现方法介绍

首先看程序界面如下! 1.布局文件: 复制代码 代码如下: <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >

Android popupwindow简单使用方法介绍

先看下效果 1.首页 package com.yskj.jh.demopopupwindow; import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.LayoutInflater; import and

如何调用C标准库的exit函数详解

编译大于运算符 原定的计划中这一篇应当是要讲如何编译if表达式的,但是我发现没什么东西可以作为if的test-form的部分的表达式,所以觉得,要不还是先实现一下比较两个数字这样子的功能吧.说干就干,我决定用大于运算符来作为例子--大于运算符就是指>啦.所以,我的目标是要编译下面这样的代码 (> 1 2) 并且比较之后的结果要放在EAX寄存器中.鉴于现在这门语言还非常地简陋,没有布尔类型这样子的东西,所以在此仿照C语言的处置方式,以数值0表示逻辑假,其它的值表示逻辑真.所以上面的表达式在编译成

Python标准库itertools的使用方法

Python标准库itertools模块介绍 itertools是python内置的模块,使用简单且功能强大,这里尝试汇总整理下,并提供简单应用示例:如果还不能满足你的要求,欢迎加入补充. 使用Python标准库itertools只需简单一句导入:import itertools chain() 与其名称意义一样,给它一个列表如 lists/tuples/iterables,链接在一起:返回iterables对象. letters = ['a', 'b', 'c', 'd', 'e', 'f']

浅析python标准库中的glob

glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合. 1.通配符 星号(*)匹配零个或多个字符 import glob for name in glob.glob('dir/*'): print (name) dir/file.txt dir/file1.txt dir/file2.txt dir/filea.txt dir/fileb.txt dir/subdir 列出子目录中的文件,必须在模式中包括子目录名: import glob #用子目录查询文件 print ('Name

Django处理多用户类型的方法介绍

起步 这是许多开发者在项目初期要面临的一个普遍问题.要怎样来处理多用户类型. 本文讲介绍对于不同场景和业务需求如何设计用户模型.为项目提供指导设计. 设计之前 在梳理用户设计之前,有几个前提需要遵守. 1. 不要使用 Django 内置的 User 模型,尽管它能满足应用程序的所有要求. 正如官方Django文档强烈建议为新项目使用自定义用户模型.需求总是在变,只用固定的模型不太现实,并且一旦设置了 AUTH_USER_MODEL 后续再修改就很麻烦了. 2.无论最后选择什么方案,无论有什么业务

使用Python标准库中的wave模块绘制乐谱的简单教程

在本文中,我们将探讨一种简洁的方式,以此来可视化你的MP3音乐收藏.此方法最终的结果将是一个映射你所有歌曲的正六边形网格地图,其中相似的音轨将处于相邻的位置.不同区域的颜色对应不同的音乐流派(例如:古典.嘻哈.重摇滚).举个例子来说,下面是我所收藏音乐中三张专辑的映射图:Paganini的<Violin Caprices>.Eminem的<The Eminem Show>和Coldplay的<X&Y>. 为了让它更加有趣(在某些情况下更简单),我强加了一些限制.