Macro-Based Register Config Helper

Code

#include <stdio.h>
#include <stdint.h>
// #define SETBITena(val,enable) (((1U) << enable) | val)
#define SET_ENABLE(val, enable) \
    ((enable) ? ((val) | 1U) : (val))

// #define SETFIELDmode(val,mode) ((val >> 1 & mode) << 1)
#define SET_MODE(val, mode) \
    ((val) | (((mode) & 0x3U) << 1))

#define SET_SPEED(val, speed) \
    ((val) | (((speed) & 0x7U) << 3))

// #define SETSPEEDmode(val,speed) ((val >> 2 & speed) << 2)


// Define macros here

// uint16_t build_register(uint8_t enable, uint8_t mode, uint8_t speed) {

//     // Use macros to set fields
//     uint16_t Reg = 0;
//     Reg = SETBITena(Reg,enable);
//     Reg = SETFIELDmode(Reg,mode);
//     Reg = SETSPEEDmode(Reg,speed);
//     return Reg;
// }
uint16_t build_register(uint8_t enable, uint8_t mode, uint8_t speed)
{
    uint16_t Reg = 0;

    Reg = SET_ENABLE(Reg, enable);
    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