#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;
}
Input
1 2 4
Expected Output
37