将int8转换为int7的最快方法

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)

bru*_*uno 6

更快的方法可能是:

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)并且具有没有序列中断的代码

  • 那肯定是`((val >> 1)&0x40`,当然? (3认同)
  • 这是所有人中最慢的方法!那为什么它会获得所有的赞成? (2认同)