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

/*
 * Returns x with the n bits that begin at position p inverted (i.e., 1 changed
 * into 0 and vice versa), leaving the others unchanged.
 */

unsigned invert(unsigned x, unsigned p, unsigned n) {
    // Create mask where bits should be flipped.
    unsigned mask = ~(~0 << n) << (p + 1 - n);

    // Flip bits with mask.
    return x ^ mask;
}

int main() {
    printf("%x\n", invert(0xaa, 3, 3));
    printf("%x\n", invert(0xff, 3, 3));
}