Has*_*tar -3 c c++ performance bit-manipulation
我有一个功能,int8_t val将其转换为int7_t.
//Bit [7] reserved
//Bits [6:0] = signed -64 to +63 offset value
// user who calls this function will use it correctly (-64 to +63)
uint8_t func_int7_t(int8_t val){
uint8_t val_6 = val & 0b01111111;
if (val & 0x80)
val_6 |= 0x40;
//...
//do stuff...
return val_6;
}
Run Code Online (Sandbox Code Playgroud)
操作int8到int7 的最佳和最快方法是什么?我有效率和快速地做到了吗?还是有更好的方法?
如果重要的话,目标是ARM Cortex M0 +
更新:
在阅读了不同的答案后,我可以说这个问题被错误了?(或者我在问题中的代码是对其他人做出错误假设的原因)我有意向int7做int8
所以它将通过无所事事来完成,因为
8位:
63 = 0011 1111
62 = 0011 1110
0 = 0000 0000
-1 = 1111 1111
-2 = 1111 1110
-63 = 1100 0001
-64 = 1100 0000
Run Code Online (Sandbox Code Playgroud)
7位:
63 = 011 1111
62 = 011 1110
0 = 000 0000
-1 = 111 1111
-2 = 111 1110
-63 = 100 0001
-64 = 100 0000
Run Code Online (Sandbox Code Playgroud)
更快的方法可能是:
uint8_t val_7 = (val & 0x3f) | ((val >> 1) & 0x40);
Run Code Online (Sandbox Code Playgroud)
val & 0x3f得到6个低位(截断)并将((val >> 1) & 0x40)位移动到从位置8到7的符号
不使用if的优点是具有更短的代码(即使你可以使用算术if)并且具有没有序列中断的代码