• bitset、bitmap


    一、bitset

    中文标准库

    转载:C++bitset用法

    一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。

    1.构造

    std::bitset<size> myBitset; 构造时必须用size声明bitset的大小,构造时可以用std::string,char*,ulonglong等初始化(string和char初始化时必须只包含0和1,否则抛出异常)

    示例

    	std::bitset<4> b1(123);  //十进制123 = 二进制01111011,所以b1是1101(从第0个元素开始算起)
    	//std::bitset<4> b2("ss");  //抛出异常
    	std::bitset<4> b3(0x4); //16进制4 = 二进制100,b3 = 0010,高位不够用0补齐
    	std::bitset<4> b4("11110000"); //只取4位 b4 = 1111
    

    2.常用函数

    函数 描述
    count() 求bitset中1的个数
    size() 求bitset的大小
    test(size_t pos) 检查下标为pos处的值,0输出false
    any() bitset是否含有1
    none() bitset中是否没有1
    all() bitset是否全部为1

    示例

    	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函数参数如果越界会抛出异常

    3.bitset支持位操作符

    逻辑运算符(且或非),位运算符(异或),函数对象运算(bit_or)

    示例

    	bitset<4> bit1(string("1001"));
    	bitset<4> bit2(string("0011"));
    
    	cout << (bit1 ^= bit2) << endl;       // 1010 (bit1对bit2按位异或后赋值给bit1)
    	cout << (bit1 &= bit2) << endl;       // 0010 (按位与后赋值给bit1)
    	cout << (bit1 |= bit2) << endl;       // 0011 (按位或后赋值给bit1)
    
    	cout << (bit1 <<= 2) << endl;        // 1100 (左移2位,低位补0,有自身赋值)
    	cout << (bit1 >>= 1) << endl;        // 0110 (右移1位,高位补0,有自身赋值)
    
    	cout << (~bit2) << endl;             // 1100 (按位取反)
    	cout << (bit2 << 1) << endl;         // 0110 (左移,不赋值)
    	cout << (bit2 >> 1) << endl;         // 0001 (右移,不赋值)
    
    	cout << (bit1 == bit2) << endl;       // false (0110==0011为false)
    	cout << (bit1 != bit2) << endl;       // true  (0110!=0011为true)
    
    	cout << (bit1 & bit2) << endl;        // 0010 (按位与,不赋值)
    	cout << (bit1 | bit2) << endl;        // 0111 (按位或,不赋值)
    	cout << (bit1 ^ bit2) << endl;        // 0101 (按位异或,不赋值)
    

    4.常用修改bitset元素函数

    示例

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

    以上三个函数如果参数越界都会抛出异常

    5.类型转换

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

    6.hash

    hash

    #include <iostream>
    #include <bitset>
    #include <functional>
    
    int main()
    {
    	std::bitset<4> b1(1);
    	std::bitset<4> b2(2);
    	std::bitset<4> b3(2);
    	std::bitset<4> b4(b2);
    
    	std::hash<std::bitset<4>> hash_fn;
    
    	//b2,b3,b4的hash值相同
    	std::cout << hash_fn(b1) << '\n';
    	std::cout << hash_fn(b2) << '\n';
    	std::cout << hash_fn(b3) << '\n';
    	std::cout << hash_fn(b4) << '\n';
    
    	return 0;
    }
    

    完整示例代码

    点击查看代码
    #include <bitset>
    #include <iostream>
    using namespace std;
    
    int main()
    {
    	try
    	{
    		bitset<4> b1(123);  //十进制123 = 二进制01111011,所以b1是1101(从第0个元素开始算起)
    		//bitset<4> b2("ss");  //抛出异常
    		bitset<4> b3(0x4); //16进制4 = 二进制100,b3 = 0010,高位不够用0补齐
    		bitset<4> b4("11110000"); //只取4位 b4 = 1111
    
    		//auto ret1 = b4[55];      //如果越界直接中断
    
    		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
    
    		bitset<4> bit1(string("1001"));
    		bitset<4> bit2(string("0011"));
    
    		cout << (bit1 ^= bit2) << endl;       // 1010 (bit1对bit2按位异或后赋值给bit1)
    		cout << (bit1 &= bit2) << endl;       // 0010 (按位与后赋值给bit1)
    		cout << (bit1 |= bit2) << endl;       // 0011 (按位或后赋值给bit1)
    
    		cout << (bit1 <<= 2) << endl;        // 1100 (左移2位,低位补0,有自身赋值)
    		cout << (bit1 >>= 1) << endl;        // 0110 (右移1位,高位补0,有自身赋值)
    
    		cout << (~bit2) << endl;             // 1100 (按位取反)
    		cout << (bit2 << 1) << endl;         // 0110 (左移,不赋值)
    		cout << (bit2 >> 1) << endl;         // 0001 (右移,不赋值)
    
    		cout << (bit1 == bit2) << endl;       // false (0110==0011为false)
    		cout << (bit1 != bit2) << endl;       // true  (0110!=0011为true)
    
    		cout << (bit1 & bit2) << endl;        // 0010 (按位与,不赋值)
    		cout << (bit1 | bit2) << endl;        // 0111 (按位或,不赋值)
    		cout << (bit1 ^ bit2) << endl;        // 0101 (按位异或,不赋值)
    
    		bitset<8> bit3("10011011");
    
    		cout << bit3.flip(2) << endl;    //10011111  (flip函数传参数时,用于将参数位取反,本行代码将bit3下标2处"反转",即0变1,1变0
    		cout << bit3.flip() << endl;     //01100000  (flip函数不指定参数时,将bitset每一位全部取反
    
    		cout << bit3.set() << endl;      //11111111  (set函数不指定参数时,将bitset的每一位全部置为1
    		cout << bit3.set(3, 0) << endl;  //11110111  (set函数指定两位参数时,将第一参数位的元素置为第二参数的值,本行对bit3的操作相当于bit3[3]=0
    		cout << bit3.set(3) << endl;     //11111111  (set函数只有一个参数时,将参数下标处置为1
    
    		cout << bit3.reset(4) << endl;   //11101111  (reset函数传一个参数时将参数下标处置为0
    		cout << bit3.reset() << endl;    //00000000  (reset函数不传参数时将bitset的每一位全部置为0
    
    		bitset<8> bit4("10011011");
    
    		string s = bit4.to_string();             //将bitset转换成string类型
    		unsigned long a = bit4.to_ulong();       //将bitset转换成unsigned long类型
    		unsigned long long b = bit4.to_ullong(); //将bitset转换成unsigned long long类型
    
    		cout << s << endl; //10011011
    		cout << a << endl; //155
    		cout << b << endl; //155
    
    		int test = 0;
    	}
    	catch (...)
    	{
    		cout << "error\n";
    	}
    }
    

    二、bitmap

    c++没有bitmap,bitmap可以用来处理海量数据。定义一个map,key设置为要存放的元素,value设置为一个bit值。

    bitmap示例

    hash_map(unordered_map)

    三、std::byte

    中文标准库:std::byte

  • 相关阅读:
    Hadoop HDFS的Shell操作实例
    我来阿里的2年
    设计模式之迪米特原则(LoD)
    设计模式之接口隔离原则
    设计模式之依赖倒置原则
    设计模式之里氏替换原则(LSP)
    设计模式之单一职责原则(SRP)
    Android开发系列之性能优化
    Android开发系列之屏幕密度和单位转换
    Android开发系列之ListView
  • 原文地址:https://www.cnblogs.com/mmmmmmmmm/p/15558160.html
Copyright © 2020-2023  润新知