gpt4 book ai didi

c - 如何从二进制文件中读取反转的数字?

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

我想从 C 中的二进制文件中读取一个 32 位数字。问题是位的顺序颠倒了。例如,3 位数字 110 代表 3,而不代表 6。开始时我们有最低有效位 (2^0),然后是 2^1,依此类推。在 C 中有什么简单的方法可以做到这一点,还是我必须自己编写所有逻辑(读取第一位,将其乘以 2^0,相加,重复到最后)?

最佳答案

你有很多可能的方法:

可移植:

(不是我的算法)

uint32_t rev(uint32_t x)
{
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return((x >> 16) | (x << 16));
}

uint32_t bit_reverse_4bytes(uint32_t x)
{
x = ((x & 0xF0F0F0F0) >> 4) | ((x & 0x0F0F0F0F) << 4);
x = ((x & 0xCCCCCCCC) >> 2) | ((x & 0x33333333) << 2);
return ((x & 0xAAAAAAAA) >> 1) | ((x & 0x55555555) << 1);
}

天真

uint32_t naiverevese(uint32_t x)
{
uint32_t result = 0;
for(int i = 0; i < 32; i++)
{
result |= x & 1;
result <<=1;
x >>= 1;
}
return result;
}

或查找表。

不便携但最高效:

许多处理器都有专门的说明,例如:

ARM - rbit 和内部 unsigned int __rbit(unsigned int val)

关于c - 如何从二进制文件中读取反转的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56368919/

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