【C言語】練習2-8
4715 ワード
第1の解法構想は、「x最右端右シフト1ビット」と「このビット左シフト最左端」を毎回【または演算】し、n回のサイクルを行えばよい.
実装コードは次のとおりです.
#include<stdio.h>
void main(){
unsigned rightrot(unsigned x, int n);
unsigned a = rightrot(3,1);
// 2^31 = 2147483648
printf("%u
",a);
}
/*rightrot: rotate x to the right by n position*/
unsigned rightrot(unsigned x, int n)
{
int wordlength(void);
int rbit; /* rightmost bit*/
while(n-- > 0)
{
rbit = x << (wordlength() - 1);
x = x >> 1;
x = x | rbit;
}
return x;
}
int wordlength(void)
{
int i;
unsigned v = (unsigned) ~0;
for(i = 1; (v = v >> 1) > 0; ++i)
;
return i;
}
第2の解法構想:x中の最右端位が1か0かを判断し、1であれば演算を行い、0であれば直接右にシフトすればよい.
実装コードは次のとおりです.
#include<stdio.h>
void main(){
unsigned rightrot(unsigned x, unsigned n);
unsigned a = rightrot(3,1);
printf("%u
",a);
}
unsigned rightrot(unsigned x, unsigned n)
{
while (n > 0){
if ((x & 1) == 1){ // 1,
x = (x >> 1) | ~(~0U >> 1);
}else{ // 0 , 。
x = (x >> 1);
}
n--;
}
return x;
}
参考資料:http://blog.csdn.net/whdugh/article/details/8162904