我做這項工作2-8 K&R C練習什麼是錯的?
寫一個函數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
yeap,0x8ff是當我把<<(bitpos) – warrior