演習7ー5
問: 符号無し整数xの第posビットから第 pos + n – 1 ビットまでのn個のビットを、セットした値を返す関数set_n、リセットした値を返す関数reset_n、反転した値を返す関数inverse_nを作成せよ。
// Ex0705.c
#include
int count_bits(unsigned x)
{
int bits = 0;
while(x){
if(x & 1U) bits++;
x >>= 1;
}
return bits;
}
int int_bits()
{
return count_bits(~0U);
}
void print_bits(unsigned x)
{
int i;
for(i = int_bits() - 1; i >= 0; i--)
putchar(((x >> i) & 1U) ? '1' : '0');
}
unsigned lrotate(unsigned x, int n)
{
int i = int_bits();
return((x << n | x >> (i - n)));
}
unsigned set_n(unsigned x, int pos, int n)
{
for(int i = pos ; i <= (pos + n); i ++){
x = (x | lrotate(1U, i));
}
return x ;
}
unsigned reset_n(unsigned x, int pos, int n)
{
for(int i = pos ; i <= (pos + n); i ++){
x = (x & ~lrotate(1U, i));
}
return x ;
}
unsigned inverse_n(unsigned x, int pos, int n)
{
for(int i = pos ; i <= (pos + n); i ++){
x = (x ^ lrotate(1U, i));
}
return x ;
}
int main(void)
{
unsigned x, pos, n;
printf("非負の整数を入力して下さい:"); scanf("%u",&x);
printf("何ビット目を変更しますか:"); scanf("%u",&pos);
printf("何ビット目まで変換しますか:"); scanf("%u",&n);
printf("\n整数 :"); print_bits(x);
printf("\n%dビット目から+%dビット目までを1にします。 :",pos, n); print_bits(set_n(x,pos,n));
printf("\n%dビット目から+%dビット目までを0にします。 :",pos, n); print_bits(reset_n(x,pos,n));
printf("\n%dビット目から+%dビット目までを反転します。 :",pos, n); print_bits(inverse_n(x,pos,n));
putchar('\n');
return 0;
}
コメント
実行時に全部0か1にして結果を見ながらつくるべし。
書籍情報
コメント