#include <stdio.h>
#include <stdint.h>
#define ENABLE_Pos 0
#define MODE_Pos 1
#define SPEED_Pos 3
#define ENABLE_Msk (1 << ENABLE_Pos)
#define MODE_Msk (0x3U << MODE_Pos)
#define SPEED_Msk (0x7U << SPEED_Pos)
#define REG_SET_ENABLE(reg) ((reg) |= ENABLE_Msk)
#define REG_CLR_ENABLE(reg) ((reg) &= ~ENABLE_Msk)
#define REG_SET_MODE(reg, mode) \
do { \
(reg) = ((reg) & ~MODE_Msk) | (((mode) & 0x3U) << MODE_Pos); \
} while (0)
#define REG_SET_SPEED(reg, speed) \
do { \
(reg) = ((reg) & ~SPEED_Msk) | (((speed) & 0x7U) << SPEED_Pos); \
} while (0)
#define REG_GET_ENABLE(reg) (((reg) & ENABLE_Msk) >> ENABLE_Pos)
#define REG_GET_MODE(reg) (((reg) & MODE_Msk) >> MODE_Pos)
#define REG_GET_SPEED(reg) (((reg) & SPEED_Msk) >> SPEED_Pos)
#define REG_PACK(enable, mode, speed) \
( ((enable) & 0x1U) << ENABLE_Pos | \
((mode) & 0x3U) << MODE_Pos | \
((speed) & 0x7U) << SPEED_Pos )
uint16_t build_register(uint8_t enable, uint8_t mode, uint8_t speed) {
uint16_t reg = 0;
if (enable) {
REG_SET_ENABLE(reg);
} else {
REG_CLR_ENABLE(reg);
}
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;
}
Input
1 2 4
Expected Output
37