#include <stdio.h>
#include <stdint.h>
// Define macros here
#define SET(val, pos) val |= (1 << pos)
#define ENABLE(val, enable) enable ? SET(val, 0) : val
#define MODE(val, mode) { \
if (mode >= 3) { \
SET(val, 1); \
SET(val, 2); \
} else { \
SET(val, mode); \
} \
} \
#define SPEED(val, speed) { \
switch(speed) \
{ \
case 1: \
SET(val, 3); \
break; \
case 2: \
SET(val, 4); \
break; \
case 3: \
SET(val, 3); \
SET(val, 4); \
break; \
case 4: \
SET(val, 5); \
break; \
case 5: \
SET(val, 3); \
SET(val, 5); \
break; \
case 6: \
SET(val, 4); \
SET(val, 5); \
break; \
case 7: \
SET(val, 3); \
SET(val, 4); \
SET(val, 5); \
break; \
} \
} \
uint16_t build_register(uint8_t enable, uint8_t mode, uint8_t speed) {
// Use macros to set fields
uint16_t val = 0;
// Enable bit
ENABLE(val, enable);
MODE(val, mode);
SPEED(val, speed);
return 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;
}
Input
1 2 4
Expected Output
37