Blob


1 /*
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.
5 */
7 #include <stdio.h>
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);
13 main()
14 {
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));
19 }
21 /*
22 a b c d e f 0 1
23 1010 1011 1100 1101 1110 1111 0000 0001
24 1010 1011 1100 1101 1111 0000 1111 0001
25 a b c d f 0 f 1
27 1 2 3 4 5 6 7 8
28 0001 0010 0011 0100 0101 0110 0111 1000
29 0001 1101 1101 0100 0101 0110 0111 1000
30 1 d d 4 5 6 7 8
32 9 2 f a b 3 d a
33 1001 0010 1111 1010 1011 0011 1101 1010
34 1001 0010 1111 1010 1011 0000 0011 1010
35 9 2 f a b 0 3 a
37 1 b a 8 3 d e a
38 0001 1011 1010 1000 0011 1101 1110 1010
39 0001 1011 1010 1011 1100 0010 0110 1010
40 1 b a b c 2 6 a
41 */
43 unsigned invert(unsigned x, int p, int n) {
44 return setbits(x, p, n, ~getbits(x, p, n));
45 }
47 unsigned setbits(unsigned x, int p, int n, unsigned y)
48 {
49 return ((x >> (p+1)) << (p+1)) | (getbits(y, n-1, n) << (p-n+1)) | (x & ~(~0 << (p-n+1)));
50 }
52 unsigned getbits(unsigned x, int p, int n)
53 {
54 return (x >> (p+1-n)) & ~(~0 << n);
55 }