Blob


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