[英]Efficiently converting 16-bits short to 8-bits char
我正在研究一個沒有硬件分區的Cortex M0 cpu,所以每次分割一些東西時,都會使用GCC庫函數。 現在,我做的最多的除法之一就是除以256,將短路轉換為字節。 有沒有什么方法可以比默認的GCC庫更有效地(比如通過位移)做到這一點?
根據您的意見,您希望-32768映射到0,32767映射到255.因此,您想要的公式是:
short s = /* input value */;
unsigned char c = (unsigned char) ((s + 32768) / 256);
其他評論者已經注意到你可以用右移或其他各種策略來划分256分,這是真的 - 合理的版本是:
unsigned char c = (unsigned char) ((s + 32768) >> 8);
但是,不需要這樣的優化。 GCC非常聰明地將逐行操作轉換為特殊情況實現,在這種情況下,它將這兩者編譯成完全相同的代碼(使用-O2 -mcpu=cortex-m0 -mthumb
和GCC 4.7.2進行測試) ):
mov r3, #128
lsl r3, r3, #8
add r0, r0, r3
lsr r0, r0, #8
uxtb r0, r0
如果你試圖太聰明(就像在其他答案中使用union或指針演示的例子一樣),你可能只會混淆它並讓事情變得更糟 - 特別是因為那些工作是由內存加載,並且添加32768意味着你已經擁有寄存器中的值。
只是施放一個指針。
unsigned char *bytes = (unsigned char*)&yourvalue;
現在, bytes[0]
將保持值的一個字節,而bytes[1]
將保持另一個bytes[1]
。 順序取決於系統的字節順序
你可以這樣使用union
:
#include <stdio.h>
union Word {
struct {
unsigned char high;
unsigned char low;
} byte;
unsigned short word;
};
int main(int argc, char **argv) {
union Word word;
word.word = 0x1122;
printf("L = 0x%x, H = 0x%x", word.byte.low, word.byte.high);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.