Macro-Based Register Config Helper

Code

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

#define ENABLE_START_POS    0U
#define MODE_START_POS      1U
#define SPEED_START_POS     3U

#define ENABLE_END_POS      0U
#define MODE_END_POS        2U
#define SPEED_END_POS       5U

#define POS_MASK(val) (1 << (val + 1)) - 1

// Define macros here
#define SET_ENABLE(val)     ((val & POS_MASK(ENABLE_END_POS)) << ENABLE_START_POS)
#define SET_MODE(val)       ((val & POS_MASK(MODE_END_POS)) << MODE_START_POS)
#define SET_SPEED(val)      ((val & POS_MASK(SPEED_END_POS)) << SPEED_START_POS)

uint16_t build_register(uint8_t enable, uint8_t mode, uint8_t speed) {
    uint16_t reg_val = 0;
    reg_val |= SET_ENABLE(enable);
    reg_val |= SET_MODE(mode);
    reg_val |= SET_SPEED(speed);
    return reg_val;
}

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