実現したいこと
符号なし整数xの第posビットを、セットした値を返す関数set、リセットした値を返す関数resetを作成する。
※ご指摘ありがとうございます。値を返す、ではなく表示する関数でした。一度値を返す関数として回答してくださった方はそのまま教えていただきたいです。
前提
上の問題で、下のようにコードを作成しましたが、リセットの方で正しい値が返されません。
該当のソースコード
C言語
1#include <stdio.h> 2 3int count_bits(unsigned x) 4{ 5 int bits = 0; 6 while (x){ 7 if (x & 1U) bits++; 8 x >>=1; 9 } 10 return bits; 11} 12 13//--- unsigned型のビット数を返す---// 14int int_bits(void){ 15 return count_bits(~0U); 16} 17 18//---unsigned型のビット内容を表示---// 19void print_bits(unsigned x) 20{ 21 for (int i = int_bits() - 1; i >= 0; i--) 22 putchar(((x >> i) & 1U) ? '1' : '0'); 23} 24 25unsigned set(unsigned x, int pos) 26{ 27 for (int i = int_bits() - 1; i >= pos ; i--) 28 putchar(((x >> i) & 1U ) ? '1' : '0'); 29 30 putchar(((x >> (pos - 1)) & ~1U) ? '1' : '0'); 31 32 for (int i = pos - 2; i >= 0; i--) 33 putchar(((x >> i) & 1U) ? '1' : '0'); 34 35 return 0; 36} 37 38unsigned reset(unsigned x, int pos) 39{ 40 for (int i = int_bits() - 1; i >= pos ; i--) 41 putchar(((x >> i) & 1U ) ? '1' : '0'); 42 putchar(((x >> (pos - 1)) & ~1U) ? '1' : '0'); 43 44 for (int i = pos - 2; i >= 0; i--) 45 putchar(((x >> i) & 1U) ? '1' : '0'); 46 47 return 0; 48} 49 50 51int main(void) 52{ 53 unsigned n1, n2; 54 55 printf("非負の整数:"); scanf("%u", &n1); 56 printf("第何ビットを変更しますか?"); scanf("%u", &n2); 57 58 printf("もとの数 = "); print_bits(n1); putchar('\n'); 59 printf("第%uビットをセットした値 ",n2); set(n1,n2); putchar('\n'); 60 printf("第%uビットをリセットした値 ",n2); reset(n1,n2); putchar('\n'); 61 62 return 0; 63 64}
試したこと
set関数は合っていると思います。
reset関数に関して、例えば実行結果が以下のようになり、リセットされません。
非負の整数:127
第何ビットを変更しますか?3
もとの数 = 00000000000000000000000001111111
第3ビットをセットした値 00000000000000000000000001111111
第3ビットをリセットした値 00000000000000000000000001111111
