位域
当我们需要节省内存,比如某个变量值只有0和1两种状态,或者两个值都只是不超过127的数,如何节省内存呢?当然可以直接定义变量进行位操作,但是位操作往往会涉及到较多的& |之类的操作,往往不能让人一眼就明白要表达的意思。实际上,使用“位域”可以轻松实现上述需求,并且可读性较强。
- 使用位操作:
代码:
int main()
{
unsigned char a=0;
a=a&0x0f|0xB0;
a=a&0xf0|0x05;
cout<<(int)a<<endl;
cout<<hex<<(int)a<<endl;
return 0;
}
效果:
这样能得到预期的结果,但是实际上比较繁琐,别人看你的代码的时候需要仔细看你的位操作才能明白是干嘛的。
使用位域
位域其实就是将一个变量看做一个结构,而每一个域对应操作某一些位,在使用的时候需要保证不溢出,不然就出问题了
代码:struct a { unsigned char b : 4; unsigned char c : 4; }a; int main() { struct a a; cout <<"size:" <<sizeof a << endl<<endl; for (a.b = 1; a.b<10; ++a.b) { for (a.c = 1; a.c<10; ++a.c) { if (a.b % 3 != a.c % 3) cout << (int)(a.b) << " " << (int )(a.c) << " "; else cout<<" "; } cout << endl; } return 0; }
这个题目据说是微软的一个面试题,具体题目记不清了,大概是只允许使用一字节变量遍历一个9*9的棋盘,然后干啥、、、
效果
位域操作相对位操作来说直接明了得多,容易阅读,实际上c++的bitset类也可以很容易的用于空间要求高的场合。