26. Extract and Modify Field in a 32-bit Register

Back To All Submissions
Previous Submission
Next Submission

Code

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

uint32_t sum_one(uint32_t reg)
{
    // sum 1 logic: first bit 0 flip to 1
    // all bits 1 in right handside of first bit 0 flip to 0
    uint32_t m = 1U;
    while((reg & m))
    {
        // flip bits 1 to 0
        reg = reg ^ m;
        m = m << 1U;
    }
    reg = reg ^ m; // flip first bit 0 to 1
    return reg;
}

uint32_t update_register(uint32_t reg) {
    // Your logic here
    uint32_t field = 0U;
    field = (field | (reg >> 10U)) & 0x001F;
    if (field != 31U)
    {
        field =  sum_one(field);
    }
    // clear field first
    reg = (reg & ~(0x001F << 10U));
    // update value
    reg = (reg | (field << 10U));
    return reg;
}

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

Solving Approach

 

 

 

Was this helpful?
Upvote
Downvote