gpt4 book ai didi

c - 交换 2 个字节的整数

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:08 25 4
gpt4 key购买 nike

我有一个接收 3 个参数的方法:int x、int n 和 int m。它返回一个 int,其中交换了 x 的第 n 个和第 m 个字节

x 只是一个普通的整数,可以设置为任意值。 n和m是0到3之间的整数。

例如,设x的十六进制表示为0x12345678,n为0,m为2。最后一个字节和倒数第三个字节应该交换(n = 78,m = 34)。

我已经弄清楚如何从 x 中提取第 n 个和第 m 个字节,但我不知道如何将所有 4 个字节重新组合成该方法应该返回的整数。

这是我当前的代码:`

int byteSwap(int x, int n, int m)
{
// Initialize variables which will hold nth and mth byte
int xn = x;
int xm = x;
// If n is in bytes, n << 3 will be the number of bits in that byte
// For example, if n is 2 (as in 2 bytes), n << 3 will be 16 (as in 16 bits)
xn = x >> (n << 3);
// Mask off everything except the part we want
xn = xn & 0xFF;
// Do the same for m
xm = x >> (m << 3);
xm = xm & 0xFF;
}

`

还有一些额外的限制 - 只允许以下限制:

~ & ^ | ! + << >>

(这意味着没有 - * / 、循环、 if 等。但是,可以初始化其他变量并且添加仍然可以。)

我的代码可以提取第 n 个和第 m 个字节,但我不知道如何在不使用 ifs 的情况下重新组合所有内容。

最佳答案

一些事情

你可以通过用除字节 m 和 n 之外的所有 FF 值屏蔽 x 来重新组合您可以通过将 0xFF 左移 m 次和 n 次并组合结果然后将其与 0xFFFFFFFF 异或来计算掩码

int mask = 0;
int mask_m = 0xFF << (m << 3);
int mask_n = 0xFF << (n << 3);

mask = (mask_m | mask_n) ^ 0xFFFFFFFF;

int x_swapped = (x & mask) | (xm << (n <<3)) | (xn << (m <<3));
return x_swapped;

仅供引用,当您右移一个带符号的值时,它可能会或可能不会将 1 而不是 0 传播到高位并且是实现定义的。无论哪种方式 0xFF 都会防止这种情况发生。

关于c - 交换 2 个字节的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21358762/

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