Macro-Based Register Config Helper

Code

#include <stdio.h>
#include <stdint.h>

/* Field positions (LSB-first) */
#define ENABLE_POS  0
#define MODE_POS    1
#define SPEED_POS   3

/* Field widths */
#define ENABLE_W    1
#define MODE_W      2
#define SPEED_W     3

/* Helper: raw mask for a width w (unsigned) */
#define FIELD_MASK(w)   ((1U << (w)) - 1U)

/* Raw masks */
#define ENABLE_RAW_MASK FIELD_MASK(ENABLE_W)   /* 0x1 */
#define MODE_RAW_MASK   FIELD_MASK(MODE_W)     /* 0x3 */
#define SPEED_RAW_MASK  FIELD_MASK(SPEED_W)    /* 0x7 */

/* Pack macros: mask the value then shift into place (uint16_t result) */
#define SET_ENABLE(v)  ( (uint16_t)( ((uint16_t)((v) & ENABLE_RAW_MASK)) << ENABLE_POS ) )
#define SET_MODE(v)    ( (uint16_t)( ((uint16_t)((v) & MODE_RAW_MASK))   << MODE_POS ) )
#define SET_SPEED(v)   ( (uint16_t)( ((uint16_t)((v) & SPEED_RAW_MASK))  << SPEED_POS ) )

/* Optional: Unpack macros (not used here but useful) */
#define GET_ENABLE(reg)  ( (uint16_t)( ((reg) >> ENABLE_POS) & ENABLE_RAW_MASK ) )
#define GET_MODE(reg)    ( (uint16_t)( ((reg) >> MODE_POS)   & MODE_RAW_MASK   ) )
#define GET_SPEED(reg)   ( (uint16_t)( ((reg) >> SPEED_POS)  & SPEED_RAW_MASK  ) )

uint16_t build_register(uint8_t enable, uint8_t mode, uint8_t speed) {
    uint16_t reg = 0;

    /* Pack fields */
    reg |= SET_ENABLE(enable);
    reg |= SET_MODE(mode);
    reg |= SET_SPEED(speed);

    /* Ensure RESERVED bits 6-7 are zero (defensive) */
    const uint16_t RESERVED_MASK = (uint16_t)(FIELD_MASK(2) << 6); /* bits 6-7 */
    reg &= (uint16_t)(~RESERVED_MASK);

    return reg;
}

int main() {
    uint8_t enable, mode, speed;
    if (scanf("%hhu %hhu %hhu", &enable, &mode, &speed) != 3) return 0;

    uint16_t reg = build_register(enable, mode, speed);
    printf("%u", (unsigned)reg);
    return 0;
}

Solving Approach

 

 

 

Upvote
Downvote
Loading...

Input

1 2 4

Expected Output

37