关闭

C语言位域的使用方法

标签: c语言
314人阅读 评论(0) 收藏 举报
分类:

C语言位域的使用方法


最近看到国外的众筹网站有体感服参与,了解了一些,用到了30个九轴传感器(陀螺仪、加速度计、地磁计),心想自己也来做一个,所以首先选择了BMX055这款(考虑到价格相对便宜,之前用过MPU9150,价格相对来说稍微较贵),于是网上买了几片模块并且附带了例程。只是这个例程到处都是坑,其中最多的就是数据格式转化的问题。我们单片机中的寄存器是按照二进制补码来存的,因为一个加法器即可解决加减运算,省去做硬件间发起的成本和复杂度。
这款传感器相对其他传感器较为特殊的一点是:加速度计是12位的,陀螺仪是16位的,地磁计两个轴13位,一个轴15位。。。于是,我必须取出有效的符号位来赋值,这就用到了位域的方法。

    首先贴代码:
    unsigned char a,b;
    short int c;
    a = b = 0xa0;
    c = (short int) (a>>4|b<<4);
    printf("c = %d",c);
    while (1);

这种情况我们本来是想将两个8位合成16位,然后再取其中的12位数据,而这12位其实是有符号的,但我们把它强制转化为16位的数据过后,符号位没了,所以得出的结果是正数。这里写图片描述
所以此时我们需要用到位域。下面贴代码:


typedef struct MyStruct
{
short int c : 12;
short int d : 12;
}data_tt;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char a,b;
short int z;
int m;
data_tt d = {0,0};
a = 0xa0;
b = 0xa0;
d.c = z = (short int)(b<<4|a>>4);
m = (int) d.c;
printf("m = %d",m);
while (1);
return 0;
}
这里写图片描述
这样就成功将12位的有符号数据提取出来并且成功转化为32位,并且没有丢调符号位。
注意的一点是用位域首先得要定义一个结构体。

1
0
查看评论

【C语言】位域的定义和使用

位域的定义和使用 C Bit Fields 转自http://www.360doc.com/content/09/0318/16/113975_2846158.shtml 位域的定义和使用   有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例...
  • xxxxxx91116
  • xxxxxx91116
  • 2013-07-02 13:45
  • 18140

C语言位域的使用方法

  • 2009-06-04 11:34
  • 3KB
  • 下载

C语言中关于位域的介绍

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。 为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段"。所谓"位域&q...
  • frank_jb
  • frank_jb
  • 2015-07-28 22:12
  • 4001

C语言位域操作

 传统的位域,可以方便的实现位操作,但是需要对结构体整体读出时比较麻烦。如果有些场合需要对位进行操作,又有把结构体整体读出需求时,往往让人不知所措,这事可以用联合体+结构体(位域)的方法实现。 位域的概念:     有些信息在存储时,并不需要占用一个完整的字节, 而只...
  • chinazhangzhong123
  • chinazhangzhong123
  • 2016-10-21 13:54
  • 487

c语言位域操作—_结构体内冒号:的使用

这是C语言位域问题 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同...
  • zhjmyx
  • zhjmyx
  • 2016-12-19 13:41
  • 807

BMX055驱动日记

上一篇提到过位域的问题,而我学习位域主要是,运用在BMX055的驱动上,这篇博客讲讲怎么驱动BMX055,BMX055是一款九轴传感器(包含陀螺仪,加速度计和地磁计)。用店家的例程时候发现数据完全不对,但是至少出来了数据,说明I2C部分是对的,于是我把原工程的I2C部分保留了下来,其余部分准备自己翻...
  • liuyuanq123
  • liuyuanq123
  • 2016-08-31 19:24
  • 1457

C语言位域(位段)

有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。所以C语言又提供了一种数据结构,称为位域或位段。 位域在应用开发中较少使用,你可以暂时跳过,遇到相关问题再回来温习。 所谓“位域”是把一个字节中的二进位...
  • changyourmind
  • changyourmind
  • 2016-07-19 11:50
  • 1655

理解C语言中的位域

C语言中的位域 有些信息在存储时,并不需要占用一个完整的字节,而只需要一个或几个二进制位即可;比如:在存放一个开关量时,只有0和1两种状态,只需要使用一个二进制位即可存储;为了节省存储空间,C语言提供了一种数据结构,称为"位域"或"位段";所谓"位...
  • guoyong10721073
  • guoyong10721073
  • 2012-11-05 22:49
  • 1481

C语言中的位域的使用

一、位域   有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并...
  • vieri_ch
  • vieri_ch
  • 2006-11-01 10:15
  • 2073
    个人资料
    • 访问:2318次
    • 积分:160
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论
  • BMX055驱动日记

    liuyuanq123: @pengrui18:加速度的话你传感器放不同面静止就会有不同的数据,根据数据分析,陀螺仪的话你绕不...

  • BMX055驱动日记

    pengrui18: 博主,问下你怎么判断加速度计、陀螺仪及地磁计输出数据是否正确,以及如何去校准他们的?

  • BMX055驱动日记

    yanqianqian2014: 你好! 最近我也在研究这款芯片,但是陀螺仪读出来的数据,不稳定,波动很大,请问是什么原因呢