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