2 * 2-7. Write a function invert(x,p,n) that returns x with the n bits
3 * that begin at position p inverted (i.e., 1 changed into 0 and vice versa),
4 * leaving the others unchanged.
9 unsigned setbits(unsigned x, int p, int n, unsigned y);
10 unsigned getbits(unsigned x, int p, int n);
11 unsigned invert(unsigned x, int p, int n);
15 printf("%u: %u\n", 0xabcdf0f1, invert(0xabcdef01, 12, 9));
16 printf("%u: %u\n", 0x1dd45678, invert(0x12345678, 27, 7));
17 printf("%u: %u\n", 0x92fab03a, invert(0x92fab3da, 9, 5));
18 printf("%u: %u\n", 0x1babc26a, invert(0x1ba83dea, 17, 11));
23 1010 1011 1100 1101 1110 1111 0000 0001
24 1010 1011 1100 1101 1111 0000 1111 0001
28 0001 0010 0011 0100 0101 0110 0111 1000
29 0001 1101 1101 0100 0101 0110 0111 1000
33 1001 0010 1111 1010 1011 0011 1101 1010
34 1001 0010 1111 1010 1011 0000 0011 1010
38 0001 1011 1010 1000 0011 1101 1110 1010
39 0001 1011 1010 1011 1100 0010 0110 1010
43 unsigned invert(unsigned x, int p, int n) {
44 return setbits(x, p, n, ~getbits(x, p, n));
47 unsigned setbits(unsigned x, int p, int n, unsigned y)
49 return ((x >> (p+1)) << (p+1)) | (getbits(y, n-1, n) << (p-n+1)) | (x & ~(~0 << (p-n+1)));
52 unsigned getbits(unsigned x, int p, int n)
54 return (x >> (p+1-n)) & ~(~0 << n);