Macro-Based Register Config Helper

Code

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

// Define macros here
/* Field positions */
#define ENABLE_POS  0 // starts at bit 0
#define MODE_POS    1 // starts at bit 1
#define SPEED_POS   3 // starts at bit 3

/* Field masks (width-limited, then shifted) */
#define ENABLE_MASK (0x1U << ENABLE_POS) // 1 bit left shifted by 0 since this is the first bit
#define MODE_MASK   (0x3U << MODE_POS)   // 2 bits left shifted by 1 since bits 1-2 are for mode
#define SPEED_MASK  (0x7U << SPEED_POS)  // 3 bits left shifted by 3 since bits 3-5 are for speed

/* Macros to write fields (clear field, then set) */
#define SET_ENABLE(reg, val) \
    ((reg) = ((reg) &= ~ENABLE_MASK) | (((uint16_t)((val) & 0x1U)) << ENABLE_POS)) // clear enable bit, limit input to 1 bit, shift into position, OR into register

#define SET_MODE(reg, val) \
    ((reg) = ((reg) &= ~MODE_MASK)   | (((uint16_t)((val) & 0x3U)) << MODE_POS)) // clear mode bits, limit input to 2 bits, shift into position, OR into register

#define SET_SPEED(reg, val) \
    ((reg) = ((reg) &= ~SPEED_MASK)  | (((uint16_t)((val) & 0x7U)) << SPEED_POS)) // clear speed bits, limit input to 3 bits, shift into position, OR into register

uint16_t build_register(uint8_t enable, uint8_t mode, uint8_t speed) {
    // Use macros to set fields
    uint16_t result = 0;

    SET_ENABLE(result, enable);

    SET_MODE(result, mode);

    SET_SPEED(result, speed);

    return result;
}

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