gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:15:49 26 4
gpt4 key购买 nike

给定一个 8 位整数“c8”,必须将位模式复制到 32 位整数“c32”中,这样​​“c32”由重复 4 次的“c8”组成。例如,

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;

两种方法都按预期工作,但我想知道从专家的角度来看哪一种被认为“更好”:-)。
在第一种方法中,我正在计算多个类次,而在第二种方法中,我正在创建一个额外的变量。我对低级事物(以及此类低级事物的性能)没有那么丰富的经验,如果有人能指出我正确的方向,或者找到更好的方法来做到这一点,我将不胜感激。

谢谢。

最佳答案

最好是使用memset。一个好的编译器将其视为 intrinsic并以尽可能最好的方式对其进行优化。我使用 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);
}

关于有效地将 8 位整数模式复制为 32 位整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47252675/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com