C言語のお勉強ページに対するご意見・ご感想スレ
38:へなちょこ管理人 ★2009/01/26(月) 23:20:16AAS
/*
符号無し整数xのposビット目からn個のビットを、1にした値を返す関数set_n、0にした値を返す関数reset_n、反転した値を返す関数inverse_n
        unsigned set_n(         unsigned x, int pos, int n) { /*…*/ }
        unsigned reset_n(       unsigned x, int pos, int n) { /*…*/ }
        unsigned inverse_n(     unsigned x, int pos, int n) { /*…*/ }
を作成せよ。
*/

#include        <stdio.h>

/*---整数x中のセットされたビット数を返す---*/
int count_bits(unsigned x)
{
        int     count = 0;
        while(x){
                if ( x & 1U )   count++;
                x >>= 1;
        }
        return count;
}

/*---unsigned型のビット数を返す---*/
int int_bits(void)
{
        return count_bits(~0U);
}

/*---unsigned型のビット内容を表示---*/
void print_bits(unsigned x)
{
        int     i;
        for ( i = int_bits() - 1; i >= 0; i-- )
                putchar((( x >> i ) & 1U ) ? '1' : '0');
        putchar('\n');
}

/*符号無し整数xのposビット目からn個のビットを1にした値を返す*/
unsigned set_n(unsigned x, int pos, int n)
{
        unsigned i = 1U;
        int j;
        for ( j = pos -1; j < pos; j++ )
        {
          i <<= 1
          i += 1;
        }
        return i | x;
}

/*符号無し整数xのposビット目からn個のビットを0にした値を返す*/
unsigned reset_n(unsigned x, int pos, int n)
{
        unsigned i = 1U;
        int j;
        for ( j = pos -1; j < pos; j++ )
        {
          i <<= 1
          i += 1;
        }
        i = ~i;
        return i & x;
}

/*符号無し整数xのposビット目からn個のビットを反転した値を返す*/
unsigned inverse_n(unsigned x, int pos, int n)
{
        unsigned i = 1U;
        int j;
        for ( j = pos -1; j < pos; j++ )
        {
          i <<= 1
          i += 1;
        }
        return i ^ x;
}

int main(void)
{
        unsigned no;
        int bit;
        
        printf("整数を入力してください:");      scanf("%lu", &no);
        puts("ビットの中身");
        print_bits(no);
        printf("何ビット目を処理しますか:");    scanf("%d", &bit);
        printf("ON_n:\t");
        print_bits(set_n(no, bit));
        printf("OFF_n:\t");
        print_bits(reset_n(no, bit));
        printf("INVERSE_n:");
        print_bits(inverse_n(no, bit));
        
        return 0;
}
1-AA