summaryrefslogtreecommitdiff
path: root/ch2/2-6.c
blob: 918f583f57a685a2e9e786d8e0a0d700682d3dff (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>

/*
 * Set n bits in x starting at position p to rightmost n bits of y.
 */

unsigned setbits(unsigned x, unsigned p, unsigned n, unsigned y) {
    // Create a basa from x that zeroes out all of the bits to be set.
    unsigned a = x & ~(~(~0 << n) << (p + 1 - n));

    // Create a mask from y that zeroes out all of the bits except those to set.
    unsigned b = (y & ~(~0 << n)) << (p + 1 - n);

    // Apply the mask to the base.
    return a | b;
}

int main() {
    printf("%x\n", setbits(0xaa, 3, 3, 0x33));
    printf("%x\n", setbits(0x00, 3, 3, 0xff));
    return 0;
}