我是一名有帮助的助手,可以为您翻译内容。
编写一个函数rightrot(x, n),返回将整数x向右旋转n位后的值。
但是当我尝试运行它时,我得到的结果不是我期望的。
#include"stdio.h"
int most_signficant_bit(unsigned x){
int bitpos;
for(bitpos = -1; x!=0;++bitpos){
x=x>>1;
}
return bitpos;
}
unsigned rightrot(unsigned x, unsigned n){
int bitpos;
bitpos = most_signficant_bit(x);
x = ((x>>n)|(((~(~0<<n))&x)<<(bitpos-n)));
return x;
}
int main(int argc, char const *argv[]) {
unsigned int c1;
c1 = 0xff1;
printf("bitfield %x "
" after rightrot %x \n",c1, rightrot(c1, 4) );
return 0;
}
我知道
(x>>n)
将位域向右移动'n'次,从中复制'n'个最不重要的位,例如0000 1111 1111
。
(~(~0<<n))&x)
复制n个最不重要的位(1111 1111 0001
& 0000 0000 1111
= 0000 0000 0001
),然后将这些位移动到正确的位置<<(bitpos-n)
,最后用或运算符将这些位复制到x
中。
但我得到的是
0xff
而不是0x1ff
,二进制为0000 1111 1111
而不是0001 1111 1111
。所以问题出在哪里呢?
ff
而不是8ff
或1ff
。 - ikrabbe