#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;
}
It runs on 64-bits and the long int is 8 bytes which is a row sized.
First, I assign two values into the lower 32 bits and higher 32 bits.
What if I want to get the 64 bits and use it?
Do I need to do the part 2 or there is a easy way of bit field to do it?
Weather Vane just fractionally ahead of me...!
You use a union. There's one in the Win32 headers (not sure I like it) called ULARGE_INTEGER but here's a quick union example which paraphases that union:
typedef union {
struct {
int32_t LowPart;
int32_t HighPart;
} u;
uint64_t QuadPart;
} ULARGE_INTEGER;
Thus if you had ULARGE_INTEGER a, a.QuadPart would give you the 64 bit part and a.u.LowPart would give you the low 32 bits. Or high 32 bits if your machine was big-endian!