###前提
c言語の勉強中の高校生です。書籍で勉強しているのですが、演習問題の答え等がないため質問することが多数あると思いますが、どうかよろしくお願いします。
###問題
符号なし整数xの第posビットから第pos + n- 1ビットまでのn個のビットを、1にした値を返す関数set_n,0にした値を返す関数reset_n,反転した値を返す関数inverse_nを作成せよ。
lang
1unsigned set_n(unsigned x, int pos, int n){/*...*/} 2unsigned reset_n(unsigned x, int pos, int n){/*...*/} 3unsigned inverse_n(unsigned x, int pos, int n){/*...*/}
###該当のソースコード
lang
1unsigned set_n (unsigned x, int pos, int n){ 2 int y = 0; //第posビットから pos + n - 1ビットまで1のビット 3 int i = 1U; 4 int t; 5 if(pos != 0){ 6 for(t = 0; t < pos + n - 1; t++){ 7 i <<= pos + t; 8 y = y | i; 9 i = 1U; 10 } 11 }else{ 12 for(t = 0; t < n; t++){ 13 i <<= t; 14 y = y | i; 15 i = 1U; 16 } 17 } 18 19 return x | y; 20} 21 22 23unsigned reset_n(unsigned x, int pos, int n){ 24 int y = 0; //第posビットから pos + n - 1ビットまで1のビット 25 int i = 1U; 26 int t; 27 if(pos != 0){ 28 for(t = 0; t < pos + n - 1; t++){ 29 i <<= pos + t; 30 y = y | i; 31 i = 1U; 32 } 33 }else{ 34 for(t = 0; t < n; t++){ 35 i <<= t; 36 y = y | i; 37 i = 1U; 38 } 39 } 40 41 if(x & y){ 42 return x ^ y; 43 }else{ 44 return x; 45 } 46} 47
###疑問点
関数set_nは正常に動作したのですが、関数reset_nは動作が不安定です。
特に第0ビットから始めようとすると意図しない結果が出てしまいます。
そのため、このコードのどこが間違っているのかを知りたいです。
また、関数inverse_nは、分からないため具体的なコードを教えていただきたいです。
###補足情報
書籍:新明解©言語 入門編
演習7-5
回答1件
あなたの回答
tips
プレビュー