【发布时间】:2019-06-23 19:24:54
【问题描述】:
我有一个函数接受 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;
}
将 int8 操作为 int7 的最佳和最快方法是什么?我做得有效率和速度吗?还是有更好的办法?
如果重要的话,目标是 ARM Cortex M0+
更新:
阅读不同的答案后,我可以说问题被问错了吗? (或者我在问题中的代码是什么给了其他人错误的假设)我打算将 int8 变成 int7
所以什么都不做,因为
8位:
63 = 0011 1111
62 = 0011 1110
0 = 0000 0000
-1 = 1111 1111
-2 = 1111 1110
-63 = 1100 0001
-64 = 1100 0000
7位:
63 = 011 1111
62 = 011 1110
0 = 000 0000
-1 = 111 1111
-2 = 111 1110
-63 = 100 0001
-64 = 100 0000
【问题讨论】:
-
你的掩码应该是
0b00111111,因为除非设置了原始值符号位,否则你不希望设置“符号位”。请注意,您并没有真正转换任何内容,您只是在基本截断。 -
在“最好和最快”之前,您需要说明正确。但是,为此,您需要解释如何处理超出“int7”可以表示的范围的输入值。
-
@JohnBollinger 哦,我删除了我认为调用此函数的用户知道他应该将数据 -64 到 +63 的评论。所以没必要去那个安全的地方..
-
@Hasanalattar 好,那么我建议你去阅读维基百科中关于 2 的补码表示。
-
“保留”没有任何意义。重要的是您要清除该位或保持原样。通常这通常意味着不要触摸它,在这种情况下你根本无事可做,只需返回整个 int8_t 值
标签: c++ c performance bit-manipulation