gpt4 book ai didi

c - 按位运算中的字节交换

转载 作者:行者123 更新时间:2023-11-30 15:24:50 24 4
gpt4 key购买 nike

我有一个名为字节交换的函数,我应该实现它。这个想法是,该函数采用 3 个整数(int x、int y、int z),并且该函数将交换 int x 的 y 和 z 字节。这些限制几乎仅限于按位运算(没有循环,也没有 if 语句或逻辑运算符,例如 ==)。

我认为我没有充分地提出这个问题,所以我要重新尝试

我现在明白了

byte 1 is referring to bits 0-7
byte 2 is referring to bits 8-15
byte 3 16-23
byte 4 24-31

我的函数应该接受 3 个整数输入:x、y 和 z。然后 x 上的 y 字节和 z 字节必须交换

int byteSwap(int x, int y, int z)

工作函数的例子

byteSwap(0x12345678, 1, 3) = 0x56341278
byteSwap(0xDEADBEEF, 0, 2) = 0xDEEFBEAD

我的原始代码有一些巨大的错误,即我认为一个字节是 2 位而不是 8 位。我遇到的主要问题是我不知道如何访问这些位给定字节内部。例如,当我得到字节 4 和 5 时,我如何访问它们的相关位?据我所知,我找不到给定字节与其起始位之间的数学关系。我假设我必须先移动然后屏蔽,并将它们保存到变量中。尽管我什至无法做到这一点。

最佳答案

使用 ((1ll << ((i + 1) * 8)) - 1) >> (i * 8) 提取第 i 个字节。使用 XOR 运算符进行交换,并将交换的字节放在它们的位置。

int x, y, z;
y = 1, z = 3;
x = 0x12345678;

int a, b; /* bytes to swap */
a = (x & ((1ll << ((y + 1) * 8)) - 1)) >> (y * 8);
b = (x & ((1ll << ((z + 1) * 8)) - 1)) >> (z * 8);

/* swap */
a = a ^ b;
b = a ^ b;
a = a ^ b;

/* put zeros in bytes to swap */
x = x & (~((0xff << (y * 8))));
x = x & (~((0xff << (z * 8))));

/* put new bytes in place */
x = x | (a << (y * 8));
x = x | (b << (z * 8));

关于c - 按位运算中的字节交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28203943/

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