HOME»基本情報技術者試験掲示板»平成30年春期 午前問1について
投稿する

平成30年春期 午前問1について [1321]

 しおりさん(No.1) 
平成30年春期 午前問1の解説における[負の数の場合]についてなのですが、ここでは何故、負数の"絶対値"を4で割るという計算を行っているのでしょうか。
通常、負数を2の補数で表現している値を10進数に変換する場合は、その負数の10進数での絶対値を求めてから、マイナスの符号を付ける作業を行います。
今回の場合も、絶対値を求め、その値にマイナスの符号を付けた数を4で割るという計算を行うべきではないでしょうか。(問題では整数値といっておりますが、正の数とは定義されていないかと思います。)
例えば、110001(2) → 49(10)
49にマイナスを付けた値が、「ある整数」となるので、
-49÷4=-12あまり-1  もしくは、
-49÷4=-13あまり3  となるかと思います。
よって、[負の数の場合]、常に「4で割った余りが-1である」もしくは、「4で割った余りが3である」となるのが正しいのではないでしょうか。
選択肢の正誤には関係ありませんが、気になったので、ご質問させていただきました。
よろしくお願いします。
2018.08.24 12:16
chaosさん(No.2) 
解説も質問者も難しく考えておられるように思います。4で割って余りを考えるときには3ビット目以上のビットがどうであれ3ビット目以上の数値は4で割り切れます(与えられた数は3ビット目以上の数と1と2ビット目で表す数の和と考えます)。余りは下位2ビットだけを考えればよいことになります。正の数で11であれば4で割ると余りは3です。負の数であれば11の絶対値は(1は0に、0は1にして1を加えますから)01となり、4で割ると余りは1になります。
2018.08.24 14:58
 しおりさん(No.3) 
ご回答ありがとうございます。
>負の数であれば11の絶対値は(1は0に、0は1にして1を加えますから)01となり、4で割ると余りは1になります。
とのことですが、負の数であるにもかかわらず、割り算の余りを出す際に、絶対値として考えるのは何故なのでしょうか。
商を出すときにはその考え方で問題ないとしても、余りを正確に考えるときには符号の有無を考える必要があると思うのですが、いかがでしょうか。
2018.08.24 15:09
chaosさん(No.4) 
申し訳ありません。負の値についての考察が不十分でしたのでその点については後程投稿します。
2018.08.24 15:11
阿南市長さん(No.5) 
「その負数の10進数での絶対値を求めてから、マイナスの符号を付ける作業を行います」と書いてありますが
そもそも2進数の補数表現をする際に10進数に戻してからマイナス符号をつけることは基本的に行いません。

  負の整数値2の補数で求める場合は、正の整数値を2進数に変換し、「0と1の数字を反転させ、1を足す」か「1を引いて、0と1を反転させる」やり方が基本です(私は前者で覚えました)。今回は10進数に戻してからマイナスをつけることが間違っていると言えます。
それと、ある整数はマイナスであるという前提を持っておられるようですが、問題文では正の整数か負の整数かの指定はありません。あとは解説に詳しい説明が書いてあるのでそちらも参考にしてみてください。
2018.08.24 15:19
chaosさん(No.6) 
被除数が負、除数が正の場合は答えが2つあります。-1/4は商0余り-1または商-1余り3となります。質問者の指摘された通りだと思います。ネットで調べると前者はC言語、VBAで採用され、後者は岩波数学辞典、Excelで採用されているとのことです。余りを被除数と同じ符号にする考え方と余りを正数にする(数値計算に都合がよい)との考え方のようです。
2018.08.24 15:38
 しおりさん(No.7) 
阿南市長さん
ご回答ありがとうございます。
私の説明が分かりづらく、申し訳ありません。
まず、
>「その負数の10進数での絶対値を求めてから、マイナスの符号を付ける作業を行います」というのは、阿南市長さんがおっしゃっているように、
>負の整数値2の補数で求める場合は、正の整数値を2進数に変換し、「0と1の数字を反転させ、1を足す」か「1を引いて、0と1を反転させる」やり方
これを行った後に、2進数から10進数に基数変換を行い、その値にマイナスの符号を付けるということです。
また、
>ある整数はマイナスであるという前提を持っておられるようですが、
こちらにつきましては、解答では、正と負の場合に分けて考えられており、[正の数の場合]については解答に問題が無かったため今回の私の質問では取り上げなかっただけであり、質問内では[負の数の場合]という条件のもとでお話をさせていただいているという状況です。
2018.08.24 15:47
 しおりさん(No.8) 
chaosさん
やはりそうですよね。
詳しくお調べいただき、ありがとうございます。
2018.08.24 15:51
 しおりさん(No.9) 
この投稿は投稿者により削除されました。(2018.08.25 10:47)
2018.08.25 10:47
 しおりさん(No.10) 
質問中で、[負の数の場合]、常に「4で割った余りが-1である」もしくは、「4で割った余りが3である」となるのが正しいのではないでしょうか。
といいましたが、問題文中に、「ここで、除算の商は、絶対値の小数点以下を切り捨てるものとする」とあるので、つまり、商は"0への丸め"の方を採用するということなので、今回は「4で割った余りが3である」ではなく、「4で割った余りが-1である」の方が採用されるというのが正しいと思い直しました。
どちらにせよ、負の場合に、余りが1というのは間違いだと思うので、修正お願いします。
2018.08.25 11:06
阿南市長さん(No.11) 
  理屈としては理解できますが問題の趣旨との乖離が見受けられるように思えます。質問者さんの意見はどちらかといえば10進数における基本的な計算によるものが大きく、問題の趣旨及び解説は、あくまで2進数における基本的な考え方(2の補数とビット演算を用いて)を説明しているだけです。
  また、「除算の商は,絶対値の小数点以下を切り捨てる」という前提に当てはめたときの説明としては、解説の内容に間違いはありません。負数を2の補数で正の絶対値に戻した上で4で割った場合の余りは確かに「1になってしまう」ことになります。
2018.08.27 04:45
助け人さん(No.12) 
FE ゴールドマイスター
横から失礼します。

chaosさん(No.6)がおっしゃる
「被除数が負、除数が正の場合は答えが2つあります。-1/4は商0余り-1または商-1余り3となります。」
の通りですね。

そうなると、しおりさん(No.10)がおっしゃる
「4で割った余りが-1である」もしくは、「4で割った余りが3である」
の通りです。

私も、しおりさん(No.10)がおっしゃるように
「負の場合に、余りが1というのは間違い」
だと思います。

管理人様が気づきやすいように、別のスレッドを立てて修正依頼をします。
2018.08.27 09:08
管理人(No.13) 
議論を読み、自分の中で整理させていただきました。
しおりさんのご指摘の通り、被除数が負ですので余りは「-1」または「3」になりますね。

助け人さんが修正用のスレッドを立ててくださったので、そちらで修正報告をさせていただこうと思います。
2018.08.31 11:59
返信投稿用フォームスパム防止のためにスレッド作成日から30日経過したスレッドへの投稿はできません。
© 2010- 基本情報技術者試験ドットコム All Rights Reserved.

Pagetop