C语言位域的使用方法_JHON_YUAN的博客-程序员秘密

技术标签: C语言  c语言  

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位,并且没有丢调符号位。
注意的一点是用位域首先得要定义一个结构体。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/liuyuanq123/article/details/52374074

智能推荐

asp.net中分页控件AspNetPager美化样式_暖枫无敌的博客-程序员秘密

在asp.net开发中数据列表分页是再常见不过的功能了,相信大家使用AspNetPager的也很多,使用CSS可以让样式更好看,如下图:新建一个名为content.css文件,如下:/*分页控件*/.paginator{ font: 11px Arial, Helvetica, sans-serif; padding: 0px 5px 0px 15px; margin:

arch linux引导不启动_arch-linux – 更新后无法启动archlinux:无法找到uuid_法务阶梯的博客-程序员秘密

我用“pacman -Syu”更新了archlinux,然后当我重新启动时,系统无法启动.这是报告:Warning: /lib/modules/4.11.9-1-ARCH/modules.devname not found - ignoringversion 232Error: device 'UUID=b5a9a977-e9a7-4d3d-96a9-dcf9c3a9010d' not found...

MATLAB中的卷积运算_matlab卷积运算_普通网友的博客-程序员秘密

Imfilter:线性空间滤波conv2:二位卷积conv2(a,b,same):将b作为模版在a上平移,最后的矩阵大小与a相同例如:a =     1     2     3     4     5     6     7     8     9b =     1     1     1     1     1     1     1

export_fig是保存图片更加清晰_Grace_five的博客-程序员秘密

export_fig是保存图片更加清晰**背景:**以前做比赛经常有图片失真,输出的线条格外模糊,当时搜索能力有限,用笨方法解决这个问题。现在偶然在论坛发现清晰保存图片的新方法。1.刚开始是保存图片的.emf和.png格式,情况稍微好点;2.有代码形式的saveas(gcf, ‘test.png’);3.print和export_fig格式print和export_fig各有千秋,pri...

Debian 9下更换Open JDK 为 Oracle JDK_PoPoXing的博客-程序员秘密

Open JDK 是许多Linux系统的默认JDK,但是Java开发一般还是使用Oracle JDK。所以,有时候我们需要把系统的默认的JDK换成Oracle的。具体可以分三步:1. 下载并解压Oracle JDK到本地电脑目录2. 设置系统变量并使其生效3. 使用alternatives机制设置Oracle JDK为系统默认的JDK下载----解压缩----安装首先是下载,需要到Oracle的官...

算法题练习:棋盘放麦子_Best 的博客-程序员秘密

问题描述国际象棋共有 64格,请在第 1 个棋盘格放 1 粒麦子,在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子,在第 4个棋盘格放 8 粒麦子,…后一格的数字是前一格的两倍,直到放完所有棋盘格。请你借助计算机准确地计算,到底需要多少粒麦子?代码实现fun main(){ // 公式求 var sum:BigInteger = BigInteger.valueOf(0) var m: BigInteger sum = BigInteger.v

随便推点

mybatis-plus的IPage分页,使用Feign调用,提示无法序列化_mybatis ipage 序列化_maiboyc1的博客-程序员秘密

针对这个bug,官方已经提供解决方案,我本地是3.1.0,更改到3.1.1就可以了

java8新特性使用lambda表达式foreach遍历map数组_lamada foreach map_令人智熄的博客-程序员秘密

java8引入了lambda表达式,同时Map中也加入了新方法,使用foreach更优雅的遍历map public static void main(String[] args) { Map&amp;lt;String, String&amp;gt; map = new HashMap&amp;lt;&amp;gt;(); map.put(&quot;aaa&quot;, &quot;111&quot;); ...

数据库 无损分解和保持依赖的判断 _不具有无损分解的理由_Summer41074的博客-程序员秘密

      批评一下自己,昨天又贪玩了,啥都没干。于是今天好好努力,将昨天的那份补上。      这几天做了几份数据库方面的试题,其他的没什么好说的,在无损分解这里每次都不知道怎么做。主要原因是书上对这一块讲解很少,我基本上没怎么注意就略过了。但是这几天做了几套试题,几乎每套都有关于无损分解的试题,让我不得不重视了起来。      首先,什么叫无损分解。无损分解就是将一个关系模式分解成若干

透彻解析!2021最新Java笔试题目,附面试题_最新Java开发面试的博客-程序员秘密

前言上个星期刷朋友圈的时候看到一个以前的同事去京东面试了,去打听都问了些啥,并让我这朋友稍稍整理了一下,因为就有了今天这篇文章啦~ 此次所例举的面试题全部都是真题哟 ~ 总共3面技术1面HR一面基本上就是基础面了,大概是花了1个小时;二面的话就问MySQL数据库比较多,三面就是综合面了…不过总的来讲,其实这次的面经最主要是围绕MySQL、事务隔离、乐观锁、HashMap、秒杀设计、微服务等方面的知识展开的了。本文已收录在我的腾讯文档,且相关的面试真题解析都有整理在我所创建的项目【2021一线互联网大

MUI区域滚动,软键盘挡住input_baibi4079的博客-程序员秘密

window.onresize=function(){ document.activeElement.scrollIntoView(false); }转载于:https://www.cnblogs.com/kelly07/p/8426237.html

控制Hive MAP个数详解_hive 字段map支持多少个key_suchy_sz的博客-程序员秘密

Hive的MAP数或者说MAPREDUCE的MAP数是由谁来决定的呢?inputsplit size,那么对于每一个inputsplit size是如何计算出来的,这是做MAP数调整的关键.HADOOP给出了Inputformat接口用于描述输入数据的格式,其中一个关键的方法就是getSplits,对输入的数据进行分片.Hive对InputFormat进行了封装:而具体采用的实现是...

推荐文章

热门文章

相关标签