前提・実現したいこと
新・明解 C言語 入門編というテキストを使って勉強をしています。
演習7-4を解いていますが、なかなか上手く行きません。
演習7-4 符号無し整数xの第posビットを、1にした値を返す関数set、0にした値を返す関数reset、反転した値を返す関数inverseを作成せよ。
unsigned set(unsigned x, int pos) {/* … /}
unsigned set(unsigned x, int pos) {/ … /}
unsigned reset(unsigned x, int pos) {/ … */}
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
結果1 整数を入力して下さい : 10 何ビット目を変更しますか? : 1 元の数 : 00000000000000000000000000001010 1ビット目を1にした数 : 00000000000000000000000000001011 1ビット目を0にした数 : 00000000000000000000000000001000 1ビット目を反転した数 : 00000000000000000000000000001011 結果2 整数を入力して下さい : 20 何ビット目を変更しますか? : 1 元の数 : 00000000000000000000000000010100 1ビット目を1にした数 : 00000000000000000000000000010111 1ビット目を0にした数 : 00000000000000000000000000010100 1ビット目を反転した数 : 00000000000000000000000000010001 …
該当のソースコード
C
1#include <stdio.h> 2 3void printbits(unsigned x) 4{ 5 int i; 6 7 for (i = (8 * sizeof(unsigned)) - 1; i >= 0; i--) 8 { 9 if ((x >> i) & 1) /* 2進数表示するために計算。 */ 10 { 11 putchar('1'); /* 1と表示させる */ 12 } 13 else 14 { 15 putchar('0'); /* 0と表示させる */ 16 } 17 } 18} 19 20unsigned lrotate(unsigned x, int n) 21{ 22 int bits = (8 * sizeof(unsigned)); /* 8ビット * sizeof(符号無し整数) */ 23 /* 今回のsizeof関数は型を返すため */ 24 return (n ? (x << n) | (x >> (bits - n)) : x); 25} 26 27unsigned set(unsigned x, int pos) 28{ 29 return (x - 1 | lrotate(1U, pos)); /* xビット目を1に変更する */ 30} 31 32unsigned reset(unsigned x, int pos) 33{ 34 return (x & ~ lrotate(1U, pos)); /* xビット目を0に変更する */ 35} 36 37unsigned inverse(unsigned x, int pos) 38{ 39 return (x - 1 ^ lrotate(1U, pos)); /* xビット目を反転させる */ 40} 41 42int main() 43{ 44 unsigned x; 45 int n; 46 47 printf("整数を入力して下さい : "); scanf("%u", &x); 48 printf("何ビット目を変更しますか? : "); scanf("%d", &n); 49 50 printf("元の数 : "); printbits(x); putchar('\n'); 51 printf("%dビット目を1にした数 : ", n); printbits(set(x, n)); putchar('\n'); 52 printf("%dビット目を0にした数 : ", n); printbits(reset(x, n)); putchar('\n'); 53 printf("%dビット目を反転した数 : ", n); printbits(inverse(x, n)); putchar('\n'); 54 55 return 0; 56}
試したこと
setを設定するコードですが、return (x | lrotate(1U, pos));にするとどうしても「x+1」ビット目を変更してしまいます。
return (x - 1 | lrotate(1U, pos));にしましたが、reset等の出力値がおかしくなります。
ダメもとでreturn ((x - 1) | lrotate(1U, pos));も試してみましたが、ダメでした。
補足情報(FW/ツールのバージョンなど)
回答2件
あなたの回答
tips
プレビュー