拜读了项目中的祖传代码,给人的感觉就是----厚重的包浆感~~~~~~~但是,祖传代码细细阅读也是有很多值得细细玩味的地方,比如对于以补码形式输出的传感器,如何进行快速的解码。
按照最容易理解的方法,就是按照补码转为原码的运算方法:[x_补]_补=X,正数的原码与补码相同,负数的补码为其反码加1。这样我们不得不再编写一个解码程序。
一个巧妙的方法思路为:计算机中数据的存储方式是按照补码形式存储的,如果传感器数据输出为32位,那么定义 Int32 x = sensor_output(...),那么x中存储的就为x的补码,如果printf(..,x),那么实际上x就是我们所需要的。
如果传感器数据输出为24位负数,即最高位(符号位)为1,那么执行 Int32 x = sensor_output(...)时,x的低24位将会填充为数据的补码,高8位为0,那么此时因为x的最高位(符号位)为0,因此x此时是一个正数,而这不是我们所需要的,因此需要向高位填充1,符合负数的补码形式:x = x|0xff000000.
此步骤相当于8086cpu的符号扩展指令CWB、cwd指令。