#include <stdio.h>
#include <stdint.h>
uint8_t set_range(uint8_t reg, uint8_t start, uint8_t end) {
//reminder: to set a bit, we OR it with 1
// overall strategy:
// upper_filter (UF): we create a binary number with 1s from pos=end to pos=0.
// lower_filter (LF): we create a binary numbers with 1s from pos=(start-1) to pos=0.
// we take the XOR of UF and LF to remove the 1s in LF from UF
// we illustrate the input case (0,2,5) in the comments below
// desired: 0011 1100
// UF (e.g., 0011 1111)
uint8_t x = 255;
uint8_t upper_filter = x >> (uint8_t)(8 - end - 1);
// LF (e.g., 0000 0011)
uint8_t lower_filter = x >> (uint8_t)(8 - start);
// 0011 1100
uint8_t filter3 = upper_filter ^ lower_filter;
reg = reg | filter3;
return reg;
}
int main() {
uint8_t reg, start, end;
scanf("%hhu %hhu %hhu", ®, &start, &end);
printf("%u", set_range(reg, start, end));
return 0;
}
Input
0 1 3
Expected Output
14