求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()可以反转全部或者特定位置的值。

求int最大值以及int二进制的更多相关文章

  1. int最大值+1为什么是-2147483648最小值-1为什么是2147483647

    今天一个新手学编程就问到这个问题,很多人第一次学编程肯定会遇到这个问题,大部分都知道是溢出之类的,用源码和补码就很容易说明 int i = -2147483648 ;这是不允许的 VS里报的错 err ...

  2. python3 获取int最大值

    python2 中获取int最大值 import sys i = sys.maxint print i 但是在python3中,报错: AttributeError: module 'sys' has ...

  3. Java中通过代码得到int类型数值的二进制形式

    一.完整代码 public class BigInteger { int sing; byte[] val; public BigInteger(int val){ // 将传递的初始值,按位取值,存 ...

  4. 求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字

    import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { pub ...

  5. 深度解析C语言int与unsigned int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...

  6. st表求区间最大值

    Input 第一行给出一个数字N,接下来N+1行,每行给出一个数字Ai,(0<=i<=N<=1E6)接来给出一个数字Q(Q<=7000),代表有Q个询问每组询问格式为a,b即询 ...

  7. Problem J: 求个最大值

    Problem J: 求个最大值 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 871  Solved: 663[Submit][Status][Web ...

  8. (转载)(int)a、&a、(int)&a、(int&)a的区别,很偏僻的题

    #include <iostream>#include <stdio.h>#include <string.h>#include <conio.h>us ...

  9. java从键盘输入若干数,求其最大值,最小值,平均值。等等

    总结:有一定基础的人,应该发现第一个程序可以运行,其实它有个致命的错误.有谁能一眼看出来呢?第二个程序是对的. 这个题目求最大值,最小值,平均值我不会求,不知道这个if判断放在类的外面还是main函数 ...

随机推荐

  1. swift中的正则表达式

    swift中的t正则表达式 正则表达式是对字符串操作的一种逻辑公式,用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规则字符串" ...

  2. Python基础简介与简单使用

    Python介绍 Python发展史 1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python’s Flyi ...

  3. Python网络编程(socket模块、缓冲区、http协议)

      网络的概念:主机   端口  IP  协议 服务器: localhost/127.0.0.1 客户端: 只是在本机启动客户端,用127.0.0.1访问     服务器: 0.0.0.0 客户端: ...

  4. [转]Android的网络与通信

    本文转自:http://www.cnblogs.com/qingblog/archive/2012/06/15/2550735.html 第一部分 Android网络基础   Android平台浏览器 ...

  5. Linux 网卡特性配置ethtool详解

    近期遇到一个自定义报文传输性能问题,解决过程中借助了ethtool这个工具,因此发掘一下与此工具相关的网卡的一些特性. ethtool 常用命令如下,比如对eth0的操作: ethtool eth0 ...

  6. SQL Server 重新编译存储过程的方式有三种

    SQL Server 中,强制重新编译存储过程的方式有三种: sp_recompile 系统存储过程强制在下次执行存储过程时对其重新编译.具体方法是:从过程缓存中删除现有计划,强制在下次运行该过程时创 ...

  7. kafka-0.9消费者新API

    ## kafka-0.9消费者新API 注:以下仅限kafka版本0.9以上Consumer新版api Consumer自动提交示例: Properties props = new Propertie ...

  8. POJ 2942 Knights of the Round Table 补图+tarjan求点双联通分量+二分图染色+debug

    题面还好,就不描述了 重点说题解: 由于仇恨关系不好处理,所以可以搞补图存不仇恨关系, 如果一个桌子上面的人能坐到一起,显然他们满足能构成一个环 所以跑点双联通分量 求点双联通分量我用的是向栈中pus ...

  9. Installing patches on an ESXi 5.x by the command

    Purpose This article outlines the procedure for installing patches on an ESXi 5.x host from the comm ...

  10. 远程桌面RDP不能粘贴文本

    刚才用远程桌面 登陆 服务器,突然发现不能在本机和远程服务器之间粘贴文本了,即不能从本机复制文本粘贴到服务器,也不能从服务器复制文本粘贴到本机. 在服务器上打开任务管理器,查看进程,有 rdpclip ...