【问题标题】:How to use bit field to get whole row bits?如何使用位域获取整行位?
【发布时间】:2016-10-05 17:02:28
【问题描述】:
#include <stdio.h>
#include <stdint.h>

struct __attribute__((__packed__)) sf_header
{
    uint64_t lower: 32;
    uint64_t higher: 32;
};
int main()
{
    struct sf_header h;

    // part 1;
    h.lower = 15;
    h.higher = 1;

    printf("lower part: %d\n", h.lower);
    printf("higher part: %d\n", h.higher);

    //part 2: how to printf the whole 64-bits (a row)
    unsigned long int lower = h.lower;
    unsigned long int higher = h.higher;
    higher = higher << 32;

    printf("lower: %ld\n", lower);
    printf("higher: %ld\n", higher);

    unsigned long int final = lower | higher;
    printf("Final: %ld\n", final);


    return 0;
}

它在 64 位上运行,long int 是 8 字节,是一个行大小。

首先,我将两个值分配给低 32 位和高 32 位。

如果我想获得 64 位并使用它怎么办?

我需要做第 2 部分还是有一种简单的位域方法可以做到这一点?

【问题讨论】:

  • union?
  • 您知道uint64_t 并部分使用它的任何原因,但随后使用unsigned long 不保证有64 位?为什么不直接打印uint64_t 类型呢?你知道inttypes.h吗?
  • "如果我想获得 64 位并使用它怎么办?"你想完成什么?
  • 位域宽度大于int/unsigned 不一定支持。可移植代码一般不会尝试uint64_t lower: 32;

标签: c bit-fields


【解决方案1】:

风向标就在我前面……!

您使用联合。 Win32 标头中有一个(不确定我是否喜欢它)称为 ULARGE_INTEGER,但这里有一个快速联合示例,它与该联合相关:

typedef union {
  struct {
    int32_t LowPart;
    int32_t HighPart;
  } u;
  uint64_t QuadPart;
} ULARGE_INTEGER;

因此,如果您有 ULARGE_INTEGER a,a.QuadPart 将为您提供 64 位部分,而 a.u.LowPart 将为您提供低 32 位。如果你的机器是大端的,或者高 32 位!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-07-20
    相关资源
    最近更新 更多