将8位整数模式有效复制到32位整数?

时间:2017-11-12 18:59:29

标签: c bit-manipulation

给定一个8位整数' c8',必须将位模式复制到一个32位整数,“c32'”,以便' c32'由' c8'组成。重复4次。例如,

if c8 =     1000 1110, 
then c32 =  1000 1110 1000 1110 1000 1110 1000 1110

我已经考虑过这个并在C中提出了两种方法。但是,我没有经验,而且我不确定哪种方法,如果有的话,我应该在决赛中使用码。

最小例子:

uint8_t c8 = 0b10001110;  // for this example

// method 1
uint32_t c32 = ((c8 << 8 | c8) << 16) | (c8 << 8 | c8); 

// method 2
uint16_t c16 = c8 << 8 | c8; 
uint32_t _c32 = c16 << 16 | c16;

这两种方法都按预期工作,但我想知道哪种方法会被认为是更好的&#39;来自专家&#39;观点:-)。
在第一种方法中,我计算多个班次,而在第二个方法中,我创建了一个额外的变量。我不喜欢低级别的事物(以及这些低级别事物的表现),如果有人能指出我正确的方向,或者找到更好的方法,我会很感激。

谢谢。

1 个答案:

答案 0 :(得分:5)

最好是使用memset good 编译器将其视为documentation并以尽可能最佳的方式对其进行优化。我使用GCC 6.3.0 -O3

测试了以下程序
#include <stdio.h>
#include <inttypes.h>
#include <string.h>

int main(void) {
    uint32_t target;
    uint8_t byte;

    // if we don't do this, GCC could just *fold the value as a constant*
    scanf("%c", &byte);
    memset(&target, byte, sizeof(target));
    printf("%08" PRIX32 "\n", target);
}

生成的机器代码实际上最终在我的平台上执行 类似于:

#include <stdio.h>
#include <inttypes.h>
#include <string.h>

int main(void) {
    uint32_t target;
    uint8_t byte;
    scanf("%c", &byte); 

    target = 0x01010101UL * byte;
    printf("%08" PRIX32 "\n", target);
}