Macro-Based Register Config Helper

Code

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

#define ENABLE_Pos 0
#define MODE_Pos 1
#define SPEED_Pos 3

#define ENABLE_Msk   (1 << ENABLE_Pos)
#define MODE_Msk     (0x3U << MODE_Pos)
#define SPEED_Msk    (0x7U << SPEED_Pos)

#define REG_SET_ENABLE(reg)   ((reg) |= ENABLE_Msk)
#define REG_CLR_ENABLE(reg)   ((reg) &= ~ENABLE_Msk)

#define REG_SET_MODE(reg, mode) \
    do { \
        (reg) = ((reg) & ~MODE_Msk) | (((mode) & 0x3U) << MODE_Pos); \
    } while (0)

#define REG_SET_SPEED(reg, speed) \
    do { \
        (reg) = ((reg) & ~SPEED_Msk) | (((speed) & 0x7U) << SPEED_Pos); \
    } while (0)

#define REG_GET_ENABLE(reg)   (((reg) & ENABLE_Msk) >> ENABLE_Pos)
#define REG_GET_MODE(reg)     (((reg) & MODE_Msk) >> MODE_Pos)
#define REG_GET_SPEED(reg)    (((reg) & SPEED_Msk) >> SPEED_Pos)
#define REG_PACK(enable, mode, speed) \
    ( ((enable) & 0x1U) << ENABLE_Pos | \
      ((mode)   & 0x3U) << MODE_Pos   | \
      ((speed)  & 0x7U) << SPEED_Pos )

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

    if (enable) {
        REG_SET_ENABLE(reg);
    } else {
        REG_CLR_ENABLE(reg);
    }

    REG_SET_MODE(reg, mode);
    REG_SET_SPEED(reg, speed);

    return reg;
}

int main() {
    uint8_t enable, mode, speed;
    scanf("%hhu %hhu %hhu", &enable, &mode, &speed);

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

Solving Approach

 

 

 

Upvote
Downvote
Loading...

Input

1 2 4

Expected Output

37