#include <stdio.h>
#include <stdint.h>
// A bit‑level memory map is created by defining a data structure
// whose fields correspond to specific bits or bit ranges,
// Use Register struct, fills it with a value, and prints each field
// exactly as the bit‑map defines it.
struct Register {
uint32_t value;
};
/* External functions for extracting bit fields */
// bits 0–3
uint32_t field4(const struct Register* r) {
return r->value & 0xF;
}
// bits 4–7
uint32_t field3(const struct Register* r) {
return (r->value >> 4) & 0xF;
}
// bits 8–15
uint32_t field2(const struct Register* r) {
return (r->value >> 8) & 0xFF;
}
// bits 16–31
uint32_t field1(const struct Register* r) {
return (r->value >> 16) & 0xFFFF;
}
int main() {
struct Register reg;
reg.value = 26;
// Print raw value in hex (C version of std::hex + setw + setfill)
printf("Raw value: 0x%08x\n\n", reg.value);
printf("Field breakdown:\n");
printf("field4 (bits 0–3): %u\n", field4(®));
printf("field3 (bits 4–7): %u\n", field3(®));
printf("field2 (bits 8–15): %u\n", field2(®));
printf("field1 (bits 16–31): %u\n", field1(®));
return 0;
}
/*
run:
Raw value: 0x0000001a
Field breakdown:
field4 (bits 0–3): 10
field3 (bits 4–7): 1
field2 (bits 8–15): 0
field1 (bits 16–31): 0
*/