Blame


1 5dc21454 2023-07-14 jrmu /*
2 5dc21454 2023-07-14 jrmu * 2-7. Write a function invert(x,p,n) that returns x with the n bits
3 5dc21454 2023-07-14 jrmu * that begin at position p inverted (i.e., 1 changed into 0 and vice versa),
4 5dc21454 2023-07-14 jrmu * leaving the others unchanged.
5 5dc21454 2023-07-14 jrmu */
6 5dc21454 2023-07-14 jrmu
7 5dc21454 2023-07-14 jrmu #include <stdio.h>
8 5dc21454 2023-07-14 jrmu
9 5dc21454 2023-07-14 jrmu unsigned setbits(unsigned x, int p, int n, unsigned y);
10 5dc21454 2023-07-14 jrmu unsigned getbits(unsigned x, int p, int n);
11 5dc21454 2023-07-14 jrmu unsigned invert(unsigned x, int p, int n);
12 5dc21454 2023-07-14 jrmu
13 5dc21454 2023-07-14 jrmu main()
14 5dc21454 2023-07-14 jrmu {
15 5dc21454 2023-07-14 jrmu printf("%u: %u\n", 0xabcdf0f1, invert(0xabcdef01, 12, 9));
16 5dc21454 2023-07-14 jrmu printf("%u: %u\n", 0x1dd45678, invert(0x12345678, 27, 7));
17 5dc21454 2023-07-14 jrmu printf("%u: %u\n", 0x92fab03a, invert(0x92fab3da, 9, 5));
18 5dc21454 2023-07-14 jrmu printf("%u: %u\n", 0x1babc26a, invert(0x1ba83dea, 17, 11));
19 5dc21454 2023-07-14 jrmu }
20 5dc21454 2023-07-14 jrmu
21 5dc21454 2023-07-14 jrmu /*
22 5dc21454 2023-07-14 jrmu a b c d e f 0 1
23 5dc21454 2023-07-14 jrmu 1010 1011 1100 1101 1110 1111 0000 0001
24 5dc21454 2023-07-14 jrmu 1010 1011 1100 1101 1111 0000 1111 0001
25 5dc21454 2023-07-14 jrmu a b c d f 0 f 1
26 5dc21454 2023-07-14 jrmu
27 5dc21454 2023-07-14 jrmu 1 2 3 4 5 6 7 8
28 5dc21454 2023-07-14 jrmu 0001 0010 0011 0100 0101 0110 0111 1000
29 5dc21454 2023-07-14 jrmu 0001 1101 1101 0100 0101 0110 0111 1000
30 5dc21454 2023-07-14 jrmu 1 d d 4 5 6 7 8
31 5dc21454 2023-07-14 jrmu
32 5dc21454 2023-07-14 jrmu 9 2 f a b 3 d a
33 5dc21454 2023-07-14 jrmu 1001 0010 1111 1010 1011 0011 1101 1010
34 5dc21454 2023-07-14 jrmu 1001 0010 1111 1010 1011 0000 0011 1010
35 5dc21454 2023-07-14 jrmu 9 2 f a b 0 3 a
36 5dc21454 2023-07-14 jrmu
37 5dc21454 2023-07-14 jrmu 1 b a 8 3 d e a
38 5dc21454 2023-07-14 jrmu 0001 1011 1010 1000 0011 1101 1110 1010
39 5dc21454 2023-07-14 jrmu 0001 1011 1010 1011 1100 0010 0110 1010
40 5dc21454 2023-07-14 jrmu 1 b a b c 2 6 a
41 5dc21454 2023-07-14 jrmu */
42 5dc21454 2023-07-14 jrmu
43 5dc21454 2023-07-14 jrmu unsigned invert(unsigned x, int p, int n) {
44 5dc21454 2023-07-14 jrmu return setbits(x, p, n, ~getbits(x, p, n));
45 5dc21454 2023-07-14 jrmu }
46 5dc21454 2023-07-14 jrmu
47 5dc21454 2023-07-14 jrmu unsigned setbits(unsigned x, int p, int n, unsigned y)
48 5dc21454 2023-07-14 jrmu {
49 5dc21454 2023-07-14 jrmu return ((x >> (p+1)) << (p+1)) | (getbits(y, n-1, n) << (p-n+1)) | (x & ~(~0 << (p-n+1)));
50 5dc21454 2023-07-14 jrmu }
51 5dc21454 2023-07-14 jrmu
52 5dc21454 2023-07-14 jrmu unsigned getbits(unsigned x, int p, int n)
53 5dc21454 2023-07-14 jrmu {
54 5dc21454 2023-07-14 jrmu return (x >> (p+1-n)) & ~(~0 << n);
55 5dc21454 2023-07-14 jrmu }