常见数据类型的占位
编译器可以根据自身硬件来选择合适的大小,但是需要满足约束:short和int型至少为16位,long型至少为32位,并且short型长度不能超过int型,而int型不能超过long型。这即是说各个类型的变量长度是由编译器来决定的。
然而32位计算机和64位计算机中int型都是4个字节。
1字节(byte) = 8位(bit)
类型 | 占位(字节) | 占位(位) |
---|---|---|
char | 1 | 8 |
int | 4 | 32 |
int | 4 | 32 |
long long | 8 | 64 |
float | 4 | 32 |
double | 8 | 64 |
Bitset
参考原文
bitset:简称位集,在头文件<bitset>
下,是一种位集合的数据结构,(只有两个可能值的元素:0 或 1,true 或 false,…),每个元素仅占用一位,因此可以大大节省空间。
它类似与数组,。Bitsets可以使用许多二元操作符,(| &···)。
定义Constructors
bitset<len> s1;
bitset<len> s2(0xfa2);
bitset<len> bs3(string("0101111001"));
位运算操作符:
~s
: 返回对s每一位取反后的结果;
&,|,^
:返回对两个位数相同的bitset执行按位与、或、异或运算的结果;
<<, >>
:返回把一个bitset左移,右移若干位的结果.(补零);
==,!=
:比较两个位数相同的bitset代表的二进制数是否相等;
[ ]操作符:
s[k]
:表示s的第k位,即可取值也可赋值,编号从0开始;
类似于数组。
count / size
s.count(); \\返回二进制串中有多少个1
s.size(); \\返回可以容纳的位的个数
any / none
若s所有位都为0,则s.any()返回false,s.none()返回true;
若s至少有一位为1,则s.any()返回true,s.none()返回false;
s.any();
s.none();
set / rest / flip
s.set(); //把s所有位变为1;
s.set(k,v); //把s的第k位改为v,即s[k]=v;
s.reset(); //把s的所有位变为0.
s.reset(k); //把s的第k位改为0,即s[k]=0;
s.flip(); //把s所有位取反.即s=~s;
s.flip(k); //把s的第k位取反,即s[k]^=1;
to_string / to_ulong
to_string(); // 返回bitset的字符串表示
to_ulong(); // 返回bitset的整数表示
test
bool test( size_t pos ); // 返回bitset在pos位上的值