C语言 从字节数组中提取位范围并创建新的int [已关闭]

ogq8wdun  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(112)
    • 已关闭**。此问题为opinion-based。当前不接受答案。
    • 想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

21小时前关门了。
Improve this question
我需要从一个字节数组中提取位(littleendian),然后从中形成一个新的int。
假设我的字节数组是:
第一个月
我需要提取14到18位(包括14和18位)。
首先我像这样的位掩码:
[0b00011001, 0b11000000, 0b00000010, 0b11001110][1]上使用& 0b11000000,在[2]上使用& 0b00000111
然后删除第一个字节,并重置其他字节:
[0b11000000, 0b00000010, 0b00000000, 0b00000000]
如果我用这个来构造一个uint 32,结果是704,对吗?
假设MSB = 7且LSB = 0是否正确?

vngu2lb8

vngu2lb81#

正如评论中提到的,使用union会容易得多。

#include <stdio.h>
#include <stddef.h>

typedef union {
    uint32_t i;
    uint8_t c[4];
} u_t;

int main( void ) {
    u_t u = { 0 };

    // Little Endian machine
    u.c[0] = 0x19; // I believe these are the hex equivalent of OP data.
    u.c[1] = 0xC9;
    u.c[2] = 0x2A;
    u.c[3] = 0xCE;

    u.i &= 0x1F << (14-1); // Mask for 5 bits, b14-b18

    printf( "%08X\n", u.i );
    printf( "%u\n", u.i );

    printf( "%u\n", u.i >> 8 ); // my (our) mistake

    printf( "%u\n", u.i >> 14 ); // Perhaps what was intended

    return 0;
}
0002C000
180224
704
11

当然,这会简单得多,只需将值向右移位,然后屏蔽最低的5位......这是战争......

相关问题