题目:
编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的值。
自我解答:
解题思想:
循环实现,循环次数为n, 每循环一次把移出的位记录并左移31位,然后和原来的数按位或。
#include <stdio.h>
unsigned int rightrot(unsigned int x, int n)
{
int i;
for(i = 0; i < n; i++)
{
x = ((x & 1) << 31) | (x >> 1);
}
return x;
}
int main()
{
printf("0x%x\n", rightrot(0x1AA, 3));
return 0;
}
运行结果为0x40000035
参考答案:
/* rightrot: rotate x to the right by n positions */
unsigned int rightrot(unsigned int x, int n)
{
int wordlength(void);
int rbit; /* rightmost bit */
while(n-- > 0)
{
rbit = (x & 1) << (wordlength() - 1);