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.
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);
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));
22 1010 1011 1100 1101 1110 1111 0000 0001
23 1111 0000 0001 1010 1011 1100 1101 1110
27 0001 0010 0011 0100 0101 0110 0111 1000
28 0100 0110 1000 1010 1100 1111 0000 0010
32 1001 0010 1111 1010 1011 0011 1101 1010
33 1110 1101 0100 1001 0111 1101 0101 1001
37 0001 1011 1010 1000 0011 1101 1110 1010
38 0001 1110 1111 0101 0000 1101 1101 0100
41 unsigned rightrot(unsigned x, int n) {
42 return (x >> n) | setbits(0,31,n,x);
45 unsigned invert(unsigned x, int p, int n) {
46 return setbits(x, p, n, ~getbits(x, p, n));
49 unsigned setbits(unsigned x, int p, int n, unsigned y)
51 return ((x >> (p+1)) << (p+1)) | (getbits(y, n-1, n) << (p-n+1)) | (x & ~(~0 << (p-n+1)));
54 unsigned getbits(unsigned x, int p, int n)
56 return (x >> (p+1-n)) & ~(~0 << n);