如何从二进制文件中读取倒数?

时间:2019-05-29 21:42:19

标签: c binary

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

1 个答案:

答案 0 :(得分:2)

您有多种可能的方式:

便携式:

(不是我的算法)

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)