Extract and Modify Field in a 32-bit Register

Code

#include <stdio.h>
#include <stdint.h>

uint32_t update_register(uint32_t reg) {
    // Your logic here
    //printf("Original reg %b\n",reg);
    //printf("Reg after shift  %b\n",(reg>>10));


    //1. Extract a 5 bit field from 10-14
    //1.1 Shift reg so bit 10-14 is at start, then & with mask (1111 1 (0x1F))
    uint32_t field_val = (reg >> 10) & 0x1F;
    //printf("Extracted field val %d\n",field_val);
    //2. Increment field_val if value < 30
    if (field_val < 30){
        field_val++;
    }
    //printf("Incremented field val %d\n",field_val);
    //3. Rewrite new val into old position
    //3.1 Clear bits of old position
    reg &= ~(0x1F << 10);
    //printf("Reg after bit clear %b\n",reg);
    //3.2 Insert new field value into position
    reg |= (field_val << 10);
    //printf("Reg after new insert %b\n",reg);


    return reg;
}

int main() {
    uint32_t reg;
    scanf("%u", &reg);
    uint32_t updated = update_register(reg);
    printf("%u", updated);
    return 0;
}

Solving Approach

 

 

 

Upvote
Downvote
Loading...

Input

15360

Expected Output

16384