C语言位域的使用方法
来源:互联网 发布:淘宝物流怎么查询 编辑:程序博客网 时间:2024/05/19 17:58
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位,并且没有丢调符号位。
注意的一点是用位域首先得要定义一个结构体。
0 0
- C语言位域的使用方法
- C语言的位域
- C语言的位域
- C语言的位域
- C语言的位域
- C语言 位域
- c语言位域
- c语言位域
- C语言位域
- C语言 位域
- C语言位域!
- c语言--位域
- C语言位域
- c语言位域
- C语言位域
- C语言--位域
- c语言位域
- C语言:位域
- 排序概念
- 数组名做函数参数
- Android图片压缩Bitmap,Drawable
- 本博客内容以新浪博客为准(迁移到CSDN部分博客无配图)
- iOS无限轮播器框架(UICollectionView实现,添加了UIPageControl)
- C语言位域的使用方法
- ccc 2016 s4
- 2016.8.30 编程之路小总结
- 136. Single Number
- E2PROM的原理及使用
- 指针数组与数组指针
- 微信公众号多客服系统自动分组系统
- HDU POJ 1190 生日蛋糕 dfs + 剪枝
- Sklearn用户手册(三): 文本数据的处理