我遇到了以下代码,将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/
答案 0 :(得分:1)
按位运算符&
将构成一个掩码,因此在这种情况下,它将使整数的6个最高位无效。
基本上,此代码执行模% 1024
(用于无符号值)。
答案 1 :(得分:0)
data[1]
占用第二个字节; & 0x03
用二进制11
屏蔽该字节-因此:占用2位; * 256
与<< 8
相同-即将这2位压入第9位和第10位;在数据中添加data[0]
会合并这两个字节(我个人会使用|
,而不是+
)。
所以; xAccl
现在是前10位,使用大端顺序。
> 511
似乎是一个符号检查;从本质上讲,这是在说:“如果设置了第10位,则将整个对象当作一个负整数,就好像我们使用了10位二进制补码规则一样。”