求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是否相等时用)等。
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二进制的更多相关文章
- int最大值+1为什么是-2147483648最小值-1为什么是2147483647
今天一个新手学编程就问到这个问题,很多人第一次学编程肯定会遇到这个问题,大部分都知道是溢出之类的,用源码和补码就很容易说明 int i = -2147483648 ;这是不允许的 VS里报的错 err ...
- python3 获取int最大值
python2 中获取int最大值 import sys i = sys.maxint print i 但是在python3中,报错: AttributeError: module 'sys' has ...
- Java中通过代码得到int类型数值的二进制形式
一.完整代码 public class BigInteger { int sing; byte[] val; public BigInteger(int val){ // 将传递的初始值,按位取值,存 ...
- 求一个整型数字中有没有相同的部分,例如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 ...
- 深度解析C语言int与unsigned int
就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:1.signed----有符号,可修饰char.int.Int是 ...
- st表求区间最大值
Input 第一行给出一个数字N,接下来N+1行,每行给出一个数字Ai,(0<=i<=N<=1E6)接来给出一个数字Q(Q<=7000),代表有Q个询问每组询问格式为a,b即询 ...
- Problem J: 求个最大值
Problem J: 求个最大值 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 871 Solved: 663[Submit][Status][Web ...
- (转载)(int)a、&a、(int)&a、(int&)a的区别,很偏僻的题
#include <iostream>#include <stdio.h>#include <string.h>#include <conio.h>us ...
- java从键盘输入若干数,求其最大值,最小值,平均值。等等
总结:有一定基础的人,应该发现第一个程序可以运行,其实它有个致命的错误.有谁能一眼看出来呢?第二个程序是对的. 这个题目求最大值,最小值,平均值我不会求,不知道这个if判断放在类的外面还是main函数 ...
随机推荐
- NOIP2018 集训(二)
A题 神炎皇 问题描述 神炎皇乌利亚很喜欢数对,他想找到神奇的数对. 对于一个整数对 \((a,b)\) ,若满足 \(a+b\leq n\) 且 \(a+b\) 是 \(ab\) 的因子,则称 为神 ...
- 从今天开始学Python
外部链接下载吧 1. Python 3.63.chm AIP 帮助文档 下载:https://pan.baidu.com/s/1lhpv8JTC3Z7B6aZ3qQi40g 2. VMwar ...
- Android记事本05
昨天: intentFilter 今天: URL和logcat 问题: ADK更新后无法打开布局文件.xml
- 为啥shmem不回收 | drop_caches
内核在哪里禁止对tmpfs中内存页的回收 mem.limit_in_bytes同样会触发shrink_zones过程! shrink_zones是代码中的直接内存回收路径 1.try_to_free_ ...
- Scala 基础(3)—— 基础类型和基础操作
1. Scala 的一些基础类型 Scala 提供了 8 种基础类型,对应 Java 的 8 种基本数据类型. 其中包括: 整数类型:Byte, Short, Int, Long, Char 浮点类型 ...
- [CF1045C]Hyperspace Highways
题目大意:给一张$n$个点$m$条边的图,保证若有一个环,一定是完全子图,多次询问两个点之间的最短路径长度 题解:把完全子图缩成一个点,圆方树,方点权值设成$1$,圆点设成$0$即可. 卡点:数组开小 ...
- Spring Boot Executable jar/war 原理
spring boot executable jar/war spring boot里其实不仅可以直接以 java -jar demo.jar的方式启动,还可以把jar/war变为一个可以执行的脚本来 ...
- [codeforces] 97B Superset || 平面分治
原题 给出一个平面的一些点,让你添加点,使得所有点对满足以下三个要求中的一个: 1.在一个水平面上 2.在一个竖直线上 3.以这两个点为对角的矩形内包含有其他点 输出一种可行解 因为只需要可行解,且只 ...
- mac 安装 nodeJs&npm 配置
前言:继续安装 nodeJS 下载安装:直接去官网,点击安装即可. 命令式安装: 1. 安装 homebrew 2. 安装 nodeJS,使用命令:brew install node 3. 测试 no ...
- Bzoj1407 Savage
Description Input 第1行为一个整数N(1<=N<=15),即 野人的数目.第2行到第N+1每行为三个整数Ci, Pi, Li (1<=Ci,Pi<=100, ...