• 求int最大值以及int二进制


    求int最大值:(((unsigned int)(~0))>>1)  

    求int的2进制串 

    string str = "";

    int iNum = 100;

    for(int i = 0; i < sizeof(int) * 8; ++i)   {

      str += itoa((iNum >> i) & 1);

    }

    最近突然看到有相应的库实现该功能

    #include <limits>  

    cout << "max(int): " << numeric_limits<int>::max() << endl; 

    cout << "max(double): " << numeric_limits<double>::max() << endl;  

    当然该库不仅仅就这点功能,还有很多 如最小正整数(求两个double是否相等时用)等。

    boost dynamic_bitset

    dynamic_bitset:
     c++98标准为处理二进制数值提供了两个工具:vector<bool>和bitset.
    vector<bool>是对元素类型为bool的vector特化,内部并不真正存储bool值,而是以bit来压缩保存,使用代理技术来操作bit,造成的后果就是它很像容器,大多数情况下的行为与标准容器一致,但它不是容器,不满足容器的定义。
     bitset与vector<bool>类似,同样存储二进制位,但它的大小固定,而且比vector<bool>支持更多的位运算。
     vector<bool>和biset各有优缺点:vector<bool>可以动态增长,但不能方便地进行位运算,bitset则正好相反,可以方便地容纳的二进制做位运算,但不能动态增长。
     boost.dynamic_bitset的出现恰好填补了这两种之间的空白,它类似标准库的bitset,提供丰富的位运算,同时长度又是动态可变的。
    #include <boost/dynamic_bitset.hpp>
    using namespace boost;
     
     boost.dynamic_bitset几乎与std::bitset相同,包括接口和行为,唯一区别是boost.dynamic_bitset的大小是在构造函数中由参数指定的,而且运行时是动态可变的。

     注意,与vector<bool>和bitset一样,boost.dynamic_bitset不符合标准容器的定义,不是严格意义上的“容器”。

    创建与赋值:
     boost.dynamic_bitset模板参数:
    template<typename Block, typename Allocator>
    Block指示以什么类型存储二进制位,必须是一个无符号整数,默认值unsigned long。
    Allocator是类内部使用的内存分配器,默认是std::allocator<Block>

    创建boost.dynamic_bitset对象方式:
     【1】不带参数构造函数创建该对象,可以在之后增长
     【2】传入参数指定大小,并赋值,像标准容器
     【3】从另一个对象拷贝
     【4】从01字符串构造(boost.dynamic_bitset与std::biset有相同缺陷,要求字符串必须是std::string,而不能是c字符串).
    示范:
    dynamic_bitset<> db1;
    dynamic_bitset<> db2(10);
    dynamic_bitset<> db3(0x16, BOOST_BINARY(10101));//使用BOOST_BINARY宏,构造编译期二进制数,没有运行时开销,较db4使用string临时变量的构造效率高
    dynamic_bitset<> db4(string("0100"));
    dynamic_bitset<> db5(db3);
    dynamic_bitset<> db6;
    db6 = db4;

    cout<<hex<<db5.to_ulong()<<endl;
    cout<<db4[0]<<db4[1]<<<db4[2]<endl;//001
     dynamic_bitset内部按照由高到低的顺序存储二进制位

    容器:
     dynamic_bitset可以使用resize()成员函数在运行时调整容器大小,例如:
    dynamic_bitset<> db;
    db.resize(10,true);
    cout<<db<<endl;
    db.resize(5);
    cout<<db<<endl;
     清空dynamic_bitset可以使用resize(0),但更应该调用clear()函数,它更快速。
     dynamic_bitset也提供与标准容器相同的size()和empty()函数
    dynamic_bitset<> db(5, BOOST_BINARY(01110));
    cout<<db<<endl;
    assert(db.size() == 5);
    db.clear();
    assert(db.empty() && db.size() == 0);
     dynamic_bitset使用Block来存储二进制位,因此size()不能反映dynamic_bitset所占用的内存大小,dynamic_bitset提供num_blocks()返回所有二进制位占用的Block数量,即size()/sizeof(Block) * 8 +1,

     dynamic_bitset可以像vector那样使用push_back()向容器末尾追加一个值;
    dynamic_bitset<> db(5, BOOST_BINARY(01110));
    db.push_back(true); //db = 101001
     append()将整数转换为二进制位全部追加到dynamic_bitset末尾(最高位),这将使dynamic_bitset的大小增加一个Block的长度.
    dynamic_bitset<> db(5, BOOST_BINARY(01110));
    db.append(BOOST_BINARY(101);
    assert(db.size() == sizeof(unsigned long)*8 + 5);
    cout<<db<<endl;//0000000000000000000000000000010101001
    位运算与比较运算:
     与vector<bool>相似,dynamic_bitset也运用了代理技术,重载了operator[],|等操作符,可以像普通数组那样访问其中的二进制位,而且能对二进制位或整个容器做任意位运算(|,^,~,<<等)。dynamic_bitset也同时提供了各种比较操作符,可以对两个dynamic_bitset对象进行各种比较运算.
     因此对dynamic_bitset对象的操作就如同操作两个普通的二进制数,只是不能做加减乘除运算。

    dynamic_bitset<> db1(4, BOOST_BINARY(1010));
    db1[0] &=1;
    db1[0] ^=1;
    cout<<db1<<endl;//1000
    dynamic_bitset<> db2(4, BOOST_BINARY(0101));
    assert(db1 > db2);
    cout<<(db1 ^ db2 )<<endl;//1101
    cout<<(db1 | db2 )<<endl;//1101

    访问元素:
     dynamic_bitset还有数个成员函数用于测试或翻转二进制位.
     四个测试二进制位的函数:
     【1】test()函数检验第n位是否为1;
     【2】如果容器中存在二进制位1,那么any()返回true;
     【3】如果容器中不存在二进制位1,那么none()返回true;
     【4】count()函数统计容器中所有值为1的元素的数量.
    示范:
    dynamic_bitset<> db(4, BOOST_BINARY(0101));
    assert(db.test(0) && !db.test(1));
    assert(db.any() && !db.none());
    assert(db.count() == 2);
    有三个翻转二进制位的函数:
     【1】set()函数可以置全部或者特定位置为1或0;
     【2】reset*(可以置全部或者特定位置为0;
     【3】flip()可以反转全部或者特定位置的值。

  • 相关阅读:
    目前阻碍大数据成功的常见问题有哪些
    YII2 的授权(Authorization)
    CCBPM工作流引擎的消息机制与设计
    日志框架实现实时改动,实时生效,详细框架思路(2)
    manacher hihoCoder1032 最长回文子串
    C#.NEt-GDI+中的Pen測试
    Unity3D游戏开发最佳实践20技巧(一)
    Android init.rc文件浅析
    OBIEE开发手冊
    Android Jni层 创建 linux socket 出错问题解决
  • 原文地址:https://www.cnblogs.com/hailong88/p/3209389.html
Copyright © 2020-2023  润新知