16位到10位转换代码说明

时间:2018-10-20 14:26:33

标签: c++ accelerometer

我遇到了以下代码,将16位数字转换为10位数字并将其存储在整数中。有人可以向我解释AND 0x03到底发生了什么吗?

// Convert the data to 10-bits    
    int xAccl = (((data[1] & 0x03) * 256) + data[0]);    
    if(xAccl > 511) {    
      xAccl -= 1024;  
    }

链接到获得代码的位置:https://www.instructables.com/id/Measurement-of-Acceleration-Using-ADXL345-and-Ardu/

2 个答案:

答案 0 :(得分:1)

按位运算符&将构成一个掩码,因此在这种情况下,它将使整数的6个最高位无效。

基本上,此代码执行模% 1024(用于无符号值)。

答案 1 :(得分:0)

data[1]占用第二个字节; & 0x03用二进制11屏蔽该字节-因此:占用2位; * 256<< 8相同-即将这2位压入第9位和第10位;在数据中添加data[0]会合并这两个字节(我个人会使用|,而不是+)。

所以; xAccl现在是前10位,使用大端顺序。

> 511似乎是一个符号检查;从本质上讲,这是在说:“如果设置了第10位,则将整个对象当作一个负整数,就好像我们使用了10位二进制补码规则一样。”