gpt4 book ai didi

c - 在 C 中,给定一系列字节,如何复制一个字节,然后复制该字节?

转载 作者:行者123 更新时间:2023-11-30 19:33:06 25 4
gpt4 key购买 nike

我的家庭作业问题之一是获取以无符号整数表示的给定字节序列,然后复制某个字节,从而将该序列扩展一个字节。例如,如果我要对十六进制表示为 0xAABBCC 的无符号整数执行此函数,同时指定扩展第二个字节,则在此函数之前和之后输出的十六进制值将如下所示:

0xAABBCC -> 0xAABBBBCC

我已经取得了一些进展,因为我觉得我确实很好地理解了按位运算符,但我不知道如何使用按位运算符来执行像这样的更复杂的任务。鉴于这是一个家庭作业问题,我对答案持开放态度,只是将其链接到有关按位运算符的文章,但请记住,我确实掌握了基础知识,并且我更愿意看到一系列按位运算符的真实示例实际操作。

这是我到目前为止所拥有的代码。它似乎接近工作,但我只是无法掌握如何将重复的字节插入到一系列字节的中间。

unsigned long long extend_byte(unsigned x, unsigned i) //x = 0xAABBCC, i = 1
{
printf("%x\n", x); //0xaabbcc
int shiftVal = i << 3;
unsigned mask = 0xFF << shiftVal;
printf("%x\n", mask); //0x00ff
unsigned byteToCopy = x | ~mask;
printf("%x\n", byteToCopy); //0xffffbbff
x &= byteToCopy;
printf("%x\n", x); //aabbcc
return x;
}

最佳答案

问题是您的掩码屏蔽了单个字节,您需要屏蔽要复制的字节右侧的所有数字,并使用不同的掩码屏蔽该字节左侧的所有数字。检查以下内容:

uint64_t extend_byte(uint64_t x, uint64_t i)       // 0x0000000011223344 and 3
{
uint64_t allOnes = ~0x00ULL; // 0xFFFFFFFFFFFFFFFF

uint64_t shiftVal = i << 3; // i << 3 == i * 8 == 24 bits = 3 bytes
uint64_t leftMask = allOnes << shiftVal; // 0xFFFFFFFFFF000000
uint64_t leftPart = (x << 8) & leftMask; // 0x0000001122000000
uint64_t rightMask = ~leftMask; // 0x0000000000FFFFFF
uint64_t rightPart = x & ~rightMask; // 0x0000000000223344

return leftPart | rightPart; // 0x0000001122223344
}

我认为解决此类问题的技巧是逐步完成并使用所有前导零,这样您就可以看到字节是如何移动的。

关于c - 在 C 中,给定一系列字节,如何复制一个字节,然后复制该字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46356941/

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