C/C++位域知识小结
C/C++中以一定区域内的位(bit)为单位来表示的数据成为位域,位域必须指明具体的数目。位域的作用主要是节省内存资源,使数据结构更紧凑。
#include <iostream>
#include <string>
typedef struct//一个char型是8位为了节省内存空间
{
unsigned char a:3;//0-2位
unsigned char b:2;//3-4位
unsigned char c:3;//5-7位
}Demo;
void show1010(int val)
{
//printf("%d : ",val);
std::cout<<val<<"二进制=";
for(int i=7;i>=0;i--){
//依次输出它的每一个二进制位
printf("%d",(val & 1<<i)!=0);
}
//printf("\n");
std::cout<<std::endl;
}
int main()
{
Demo *tt;
char buf;
memset(buf,0,100); //对数组清0
tt = (Demo*)&buf;//取数组首地址 并强制转换为Demo结构的指针类型
tt->a = 5;
tt->b = 2;
tt->c = 7;
//一个字节值
printf("value:%d\n",buf);//打印-11
//依次输出它的每一个二进制位
show1010(buf); //输出-11的二进制文件
//当前一个字节值为: -11
//1 1 1 1 0 1 0 1 由下面计算得出
//1 1 1 1 0 1 0 1
//7 2 5
//c b a
// 要得到a值,即左边5个位与0做与运算
// 与运算
//-11 :1 1 1 1 0 1 0 1=》 -11
//0x07 :0 0 0 0 0 1 1 1=》 0x07因为a只占了最低的3位所以按位与 &0x07 得出的就是a值
//与结果 :0 0 0 0 0 1 0 1
int a = buf & 0x07;//因为a只占了3位所以按位与 &0x07 得出的就是a值
//依次输出它的每一个二进制位
show1010(a);//输出a的 二进制结果
//-11 :1 1 1 1 0 1 0 1=》 -11
//0x18 :0 0 0 1 1 0 0 0=》 0x18//因为b只占了中间的2位所以按位与 &0x18 在左移3位到最低位得出的就是b值
//与结果 :0 0 0 1 0 0 0 0
// 向右边移动3位
int b = (buf & 0x18) >> 3;//因为b只占了中间的2位所以按位与 &0x18 在左移3位到最低位得出的就是b值
//依次输出它的每一个二进制位
show1010(b);//输出b值的二进制结果
//-11 :1 1 1 1 0 1 0 1=》 -11
//0xE0 :1 1 1 0 0 0 0 0=》 0xE0//因为C只占了最高的3位所以按位与 &0xE0 在左移5位到最低位得出的就是b值
//与结果 :1 1 1 0 0 0 0 0
// 向右边移动3位
int hongen = (buf & 0xE0) >> 5;//因为C只占了最高的3位所以按位与 &0xE0 在左移5位到最低位得出的就是b值
//依次输出它的每一个二进制位
show1010(hongen);//输出b值的二进制结果
printf("a:%d\n",a);
printf("b:%d\n",b);
printf("Chongen:%d\n",hongen);
return 0;
}
页:
[1]