Blame


1 5dc21454 2023-07-14 jrmu /*
2 5dc21454 2023-07-14 jrmu * 2-8. Write a function rightrot(x,n) that returns the value of the
3 5dc21454 2023-07-14 jrmu * integer x rotated to the right by n bit positions.
4 5dc21454 2023-07-14 jrmu */
5 5dc21454 2023-07-14 jrmu
6 5dc21454 2023-07-14 jrmu #include <stdio.h>
7 5dc21454 2023-07-14 jrmu
8 5dc21454 2023-07-14 jrmu unsigned setbits(unsigned x, int p, int n, unsigned y);
9 5dc21454 2023-07-14 jrmu unsigned getbits(unsigned x, int p, int n);
10 5dc21454 2023-07-14 jrmu unsigned invert(unsigned x, int p, int n);
11 5dc21454 2023-07-14 jrmu unsigned rightrot(unsigned x, 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", 0xf01abcde, rightrot(0xabcdef01, 12));
16 5dc21454 2023-07-14 jrmu printf("%u: %u\n", 0x468acf02, rightrot(0x12345678, 27));
17 5dc21454 2023-07-14 jrmu printf("%u: %u\n", 0xed497d59, rightrot(0x92fab3da, 9));
18 5dc21454 2023-07-14 jrmu printf("%u: %u\n", 0x1ef50dd4, rightrot(0x1ba83dea, 17));
19 5dc21454 2023-07-14 jrmu }
20 5dc21454 2023-07-14 jrmu /*
21 5dc21454 2023-07-14 jrmu a b c d e f 0 1
22 5dc21454 2023-07-14 jrmu 1010 1011 1100 1101 1110 1111 0000 0001
23 5dc21454 2023-07-14 jrmu 1111 0000 0001 1010 1011 1100 1101 1110
24 5dc21454 2023-07-14 jrmu f 0 1 a b c d e
25 5dc21454 2023-07-14 jrmu
26 5dc21454 2023-07-14 jrmu 1 2 3 4 5 6 7 8
27 5dc21454 2023-07-14 jrmu 0001 0010 0011 0100 0101 0110 0111 1000
28 5dc21454 2023-07-14 jrmu 0100 0110 1000 1010 1100 1111 0000 0010
29 5dc21454 2023-07-14 jrmu 4 6 8 a c f 0 2
30 5dc21454 2023-07-14 jrmu
31 5dc21454 2023-07-14 jrmu 9 2 f a b 3 d a
32 5dc21454 2023-07-14 jrmu 1001 0010 1111 1010 1011 0011 1101 1010
33 5dc21454 2023-07-14 jrmu 1110 1101 0100 1001 0111 1101 0101 1001
34 5dc21454 2023-07-14 jrmu e d 4 9 7 d 5 9
35 5dc21454 2023-07-14 jrmu
36 5dc21454 2023-07-14 jrmu 1 b a 8 3 d e a
37 5dc21454 2023-07-14 jrmu 0001 1011 1010 1000 0011 1101 1110 1010
38 5dc21454 2023-07-14 jrmu 0001 1110 1111 0101 0000 1101 1101 0100
39 5dc21454 2023-07-14 jrmu 1 e f 5 0 d d 4
40 5dc21454 2023-07-14 jrmu */
41 5dc21454 2023-07-14 jrmu unsigned rightrot(unsigned x, int n) {
42 5dc21454 2023-07-14 jrmu return (x >> n) | setbits(0,31,n,x);
43 5dc21454 2023-07-14 jrmu }
44 5dc21454 2023-07-14 jrmu
45 5dc21454 2023-07-14 jrmu unsigned invert(unsigned x, int p, int n) {
46 5dc21454 2023-07-14 jrmu return setbits(x, p, n, ~getbits(x, p, n));
47 5dc21454 2023-07-14 jrmu }
48 5dc21454 2023-07-14 jrmu
49 5dc21454 2023-07-14 jrmu unsigned setbits(unsigned x, int p, int n, unsigned y)
50 5dc21454 2023-07-14 jrmu {
51 5dc21454 2023-07-14 jrmu return ((x >> (p+1)) << (p+1)) | (getbits(y, n-1, n) << (p-n+1)) | (x & ~(~0 << (p-n+1)));
52 5dc21454 2023-07-14 jrmu }
53 5dc21454 2023-07-14 jrmu
54 5dc21454 2023-07-14 jrmu unsigned getbits(unsigned x, int p, int n)
55 5dc21454 2023-07-14 jrmu {
56 5dc21454 2023-07-14 jrmu return (x >> (p+1-n)) & ~(~0 << n);
57 5dc21454 2023-07-14 jrmu }