首页 > 编程语言 >c++ bitse用法

c++ bitse用法

时间:2022-11-22 14:07:02浏览次数:40  
标签:long string bitse unsigned c++ 用法 bitset foo cout


c++ bitse用法

bitset类似于数组结构,但是它的每一个元素之能是0或1,每个元素仅用1bit空间。
应用是须加入​​​#include <bitset>​

0. 引子

Determine if all characters of a string are unique.

模式识别:凡是题目中涉及unique的字眼或者是否存在直觉考虑用bitset。

bool isUnique(string input) {
bitset<256> hashMap; // 利用ADCII值作为数字下标的映射
for (int i = 0; i < input.length(); i++) {
if (hashMap[(int)input[i]]) {
return false; // 如果出现相同的则返回true
}
hashMap[(int)input[i]] = 1;
}

return true; // true表示都是unique
}

1. 构造函数

bitset<10> bitset1; // 无参构造,默认都是0
bitset<10> bitset2(8); // 二进制保存,前面补0

string s = "1001";
bitset<10> bitset3(s);

char s2[] = "1001";
bitset<10> bitset4(s2);

cout << bitset1 << endl; // 0000000000
cout << bitset2 << endl; // 0000001000
cout << bitset3 << endl; // 0000001001
cout << bitset4 << endl; // 0000001001

注意:

  • 用字符串构造时,字符串只能是’0’ or ‘1’,否则会抛出异常;
  • 构造时,需要在​​<>​​中表明bitset的size;
  • 有参构造若二进制表示比bitset的size小,前面补0,反之则在二进制后面截断输出。

2. 可用的操作符

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; // 0110 (左移,不赋值)
cout << (bar>>1) << endl; // 0001 (右移,不赋值)

cout << (foo==bar) << endl; // false (0110==0011为false)
cout << (foo!=bar) << endl; // true (0110!=0011为true)

cout << (foo&bar) << endl; // 0010 (按位与,不赋值)
cout << (foo|bar) << endl; // 0111 (按位或,不赋值)
cout << (foo^bar) << endl; // 0101 (按位异或,不赋值)

此外,可以通过 [ ] 访问元素(类似数组),注意最低位下标为0,如下:

bitset <4> foo("1011");
cout << foo[0] << endl; // 1
cout << foo[1] << endl; // 1
cout << foo[2] << endl; // 0
cout << foo[3] << endl; // 1

3. 常用函数

bitset<8> foo("10011011");
cout << foo.count() << endl; //5(count函数用来求bitset中1的位数,foo中共有5个1
cout << foo.size() << endl; //8(size函数用来求bitset的大小,一共有8位

cout << foo.test(0) << endl; //true(test函数用来查下标处的元素是0还是1,并返回false或true,此处foo[0]为1,返回true
cout << foo.test(2) << endl; //false(同理,foo[2]为0,返回false

cout << foo.any() << endl; //true (any函数检查bitset中是否有1
cout << foo.none() << endl; //false (none函数检查bitset中是否没有1
cout << foo.all() << endl; //false (all函数检查bitset中是全部为1

说明

test函数会对下标越界作出检查,而通过 [ ] 访问元素却不会经过下标检查,所以,在两种方式通用的情况下,选择test函数更安全一些

bitset<8> foo ("10011011");
cout << foo.flip(2) << endl;  //10011111  (flip函数传参数时,用于将参数位取反,本行代码将foo下标2处"反转",即0变1,1变0
cout << foo.flip() << endl;   //01100000  (flip函数不指定参数时,将bitset每一位全部取反
cout << foo.set() << endl;    //11111111  (set函数不指定参数时,将bitset的每一位全部置为1
cout << foo.set(3,0) << endl;  //11110111  (set函数指定两位参数时,将第一参数位的元素置为第二参数的值,本行对foo的操作相当于foo[3]=0
cout << foo.set(3) << endl;   //11111111  (set函数只有一个参数时,将参数下标处置为1

cout << foo.reset(4) << endl;  //11101111  (reset函数传一个参数时将参数下标处置为0
cout << foo.reset() << endl;   //00000000  (reset函数不传参数时将bitset的每一位全部置为0

转换函数

bitset<8> foo ("10011011");
string s = foo.to_string();  //将bitset转换成string类型
unsigned long a = foo.to_ulong();  //将bitset转换成unsigned long类型
unsigned long long b = foo.to_ullong();  //将bitset转换成unsigned long long类型

cout << s << endl;  //10011011
cout << a << endl;  //155
cout << b << endl;  //155


标签:long,string,bitse,unsigned,c++,用法,bitset,foo,cout
From: https://blog.51cto.com/u_13875041/5877889

相关文章

  • C++11创建线程的三种方式
    1.通过函数thread:标准库的类join:阻塞主线程并等待//MultiThread.cpp:Definestheentrypointfortheconsoleapplication.#include"stdafx.h"#include<iostream>#i......
  • C++异常处理
    语法应用boolfun(){inta=7,b=0;//if(b==0)throw"error!";if(b==0)throw404.1;intc=a/b;}intmain(intargc,constchar**argv){try{......
  • C/C++预处理命令
    防止重复包含头文件#ifndef__文件名大写_H__#define__文件名大写_H__#endif//__文件名大写_H__//c++pragmaonce较老编译器不支持,以上两种方法都行。......
  • Vscode/Sublime C++ 打印中文乱码问题解决
    #include<iostream>usingnamespacestd;#ifdef_WIN32#include<windows.h>#endifintmain(){#ifdef_WIN32//控制台显示乱码纠正SetConsoleOutp......
  • 用C++写一遍linux socket通信过程
    要想深刻理解一些技术的底层,我还是觉得非用用c/c++写一遍的比较好。这其中的原因相信懂的人都懂。回忆一下上学时候在c语言课堂上的激动劲,如今感觉对c的理解真的都是那时候......
  • C++11
    longlong超长整形 C++11longlong超长整形详解(biancheng.net)    待更。。。......
  • document.querySelector()用法
    不久前,我发现了document.querySelectorJS选择器,语法类似JQuery。通过元素id获取元素<!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> </head> <......
  • Page Load()中IsPostBack用法浅析
    https://www.cnblogs.com/yhl1234/archive/2006/12/09/587114.htmlPage_Load(){  //somecodes:code1  ......  If(!IsPostBack)  {     //somecode......
  • 【C++/STL】0.容器概述
    文章目录​​一、容器分类​​​​(1)序列性容器​​​​(2)关联式容器​​​​(3)容器适配器​​​​二、容器共性​​​​三、容器比较​​一、容器分类(1)序列性容器​​序列式容......
  • 【C++/STL】2. vector向量
    vector与常用的数组类似,占用连续内存空间,对随机存取支持很好。可以类似数组用下标访问,也可以类似字符串用​​vector.at()​​成员函数访问vector是尾部开口设计,类似栈。从......