hogen 发表于 2019-11-12 09:44:58

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]
查看完整版本: C/C++位域知识小结