Set Multiple Bits in 8-bit Register

Code

#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", &reg, &start, &end);
    printf("%u", set_range(reg, start, end));
    return 0;
}

Solving Approach

 

 

 

Loading...

Input

0 1 3

Expected Output

14