gpt4 book ai didi

c - 反转字节序 C

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

我迷失了位移位操作,我正在尝试反转 32 位整数的字节顺序,我设法在网上查找的内容我只得到了这么远,但似乎无法找到它不起作用的原因

int32_t swapped = 0;         //  Assign num to the tmp 


for(int i = 0; i < 32; i++)
{

swapped |= num & 1; // putting the set bits of num

swapped >>= 1; //shift the swapped Right side

num <<= 1; //shift the swapped left side

}

我是这样打印的

num = swapped;

for (size_t i = 0; i < 32; i++)
{
printf("%d",(num >> i));
}

最佳答案

您的代码看起来像是在尝试交换位,而且不是字节。如果您想交换字节,那么“完成”方法将是:

int32_t swapped = ((num >> 24) & 0x000000FF) |
((num >> 8) & 0x0000FF00) |
((num << 8) & 0x00FF0000) |
((num << 24) & 0xFF000000);

我说“完整”,因为最后一个按位与可以省略,第一个按位与可以省略如果 num 是无符号的

如果你想交换 32 位数字中的,你的循环应该最多为 16(如果是 32,前 16 步将交换位,接下来的 16 步将它们再次交换回来)。

int32_t swapped = 0;
for(int i = 0; i < 16; ++i)
{
// the masks for the two bits (hi and lo) we will be swapping
// shift a '1' to the correct bit location based on the index 'i'
uint32_t hi_mask = 1 << (31 - i);
uint32_t lo_mask = 1 << i;

// use bitwise and to mask out the original bits in the number
uint32_t hi_bit = num & hi_mask;
uint32_t lo_bit = num & lo_mask;

// shift the bits so they switch places
uint32_t new_lo_bit = hi_bit >> (31 - i);
uint32_t new_hi_bit = lo_bit << (31 - i);

// use bitwise-or to combine back into an int
swapped |= new_lo_bit;
swapped |= new_hi_bit;
}

为可读性而编写的代码 - 有更快的方法来反转 32 位数字中的位。至于打印:

for (size_t i = 0; i < 32; i++)
{
bool bit = (num >> (31 - i)) & 0x1;
printf(bit ? "1" : "0");
}

关于c - 反转字节序 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58600925/

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