簡體   English   中英

有效地將16位短路轉換為8位短路

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM