『新・明解C言語 入門編 第2版』演習問題解答例 7ー5

演習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にして結果を見ながらつくるべし。

 


書籍情報



Copyright (C) 2016 "HYOGOKURUMI" All Rights Reserved./「来未炳吾・平極ルミ・HYOGOKURUMI」の発達障害考察を主とした全ての発信は、相互不干渉など特別な約束をした者達を除き、どなたでもご活用できます。ただし著作権は放棄しておりません。あしからずご了承ください。詳細は著作権に関するガイドラインをご一読ください。/「HYOGOKURUMI.site」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。