鱼C论坛

 找回密码
 立即注册
查看: 1207|回复: 0

[技术交流] C/C++位域知识小结

[复制链接]
发表于 2019-11-12 09:44:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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[100];
        memset(buf,0,100); //对数组清0
        tt = (Demo*)&buf[0];//取数组首地址 并强制转换为Demo结构的指针类型
        tt->a = 5;
        tt->b = 2;
        tt->c = 7;

        //一个字节值
        printf("value:%d\n",buf[0]);  //打印-11
        //依次输出它的每一个二进制位
        show1010(buf[0]); //输出-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[0] & 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[0] & 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[0] & 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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 10:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表