/*符号無し整数xのposビット目を、1にした値を返す関数set、 0にした値を返す関数reset、反転した値を返す関数inverseを作成せよ。 */ #include /*---整数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ビット目を1にした値を返す*/ unsigned set(unsigned x, int pos) { unsigned i = 1U; int width = int_bits(); i <<= pos % width - 1; return i | x; } /*符号無し整数xのposビット目を0にした値を返す*/ unsigned reset(unsigned x, int pos) { unsigned i = 1U; int width = int_bits(); i <<= pos % width - 1; i = ~i; return i & x; } /*符号無し整数xのposビット目を反転した値を返す*/ unsigned inverse(unsigned x, int pos) { unsigned i = 1U; int width = int_bits(); i <<= pos % width - 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:\t"); print_bits(set(no, bit)); printf("OFF:\t"); print_bits(reset(no, bit)); printf("INVERSE:"); print_bits(inverse(no, bit)); return 0; }