• ベストアンサー

算術シフトしたら、あれ?

16進数ので各4ビット(4桁)で2進数で算術シフトしますが、符号部はぬいて元の16進数に戻すのですか?でもそうすると元の数より大幅に減ってしまいますよね。例題の 例題・A4A6(16)を2ビット算術シフトする。 A4A6(16)=1010 0010 1010 0110 (2) ・左へ2ビットシフトする。 1000 1010 1001 1000(2)=A98(16) ・右へ2ビットシフトする。 1110 1000 1010 1001(2)=8A9(16) というように、符号部ぬかしたら増えるはずが減ったり、減るはずが増えたりと。なんか変ですよね。 ちなみに符号部すべて入れて考えたら、 左へ算術シフト 8A98(16) 右へ算術シフト E8A9(16) 増えるはずが減って、減るはずが増えるというあべこべになってしまいます。 超基本的ことなんですが、なぜか本に記載されていなかったので書きました。ご協力ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Dooon
  • ベストアンサー率20% (36/180)
回答No.3

まず「A4A6(16)=1010 0010 1010 0110 (2)」の2進数が違います。 正しくは、A) 「1010 0100 1010 0110(2)」です。 で、左へ2ビットシフトすると B) 「1001 0010 1001 1000(2)」=9298(16) 右へ2ビットシフトすると C) 「1110 0100 1010 0110(2)」=E4A6(16) で、簡単に言ってしまえば・・・ 符号部が1なので「マイナス値」を表しているので 16進数では、左で少なくなり、右で大きくなっているのでしょう。 負数なので反転させて1加算したものに"-"を付加。 A) 0101 1011 0101 1001+1=0101 1011 0101 1010(16) B) 0110 1101 0110 0111+1=0110 1101 0110 1000(16) C) 0001 1011 0101 1001+1=0001 1011 0101 1010(16) これらを10進数で表すと 5B5A = 10480 + 3072 + 80 + 6 -13638 6D68 = 24576 + 3328 + 96 + 8 -28008 1B5A = 4096 + 2816 + 80 + 10 -7002 こんな感じではないかな。

nVIDIA
質問者

お礼

まずは、どーーーーーしても直さなくてはならないもの。それはうっかりミス。サザエさんじゃあるまいし、これだけは直さなければ。だから理屈は合っているのですが、ほんのピコ単位みたいに小さなミスで×。_| ̄|○ という人間なんです。だから、質問にだした2進数で入力し間違えていて、手元の計算した紙見て「しまった~~っ」と思いました。すみません_| ̄|○ さて、そうすれば補数表現で絶対値から1の補数に変換するとき負数は反転させて、さらに2の補数に変換するとき1加算するのでしたよね。そうならば理屈が通ります。 なにか、補数表現とシフト演算のつながりまでわかって得した気持ちです。次に大事なことそれは…サザエさんミス(うっかりミス)しないことです。 どうも超わかりやすい、そして得する解説ありがとうございました。

その他の回答 (2)

回答No.2

ひとつには、「増えた」「減った」という定義がどうも、不明瞭であるということ、また、今回の「例」では、最初の左シフトの時点で「オーバーフロー」が発生しているので、その前後での挙動には連続性がないということです。 まず、「算術シフト」とは、2進数を符号付き数値と見た場合の操作ですから、0000(16) > FFFF(16) です。(前者は、0, 後者は -1) さらに、オーバーフローの問題です。 左シフトでオーバーフローが発生した場合、そのビットの情報は失われます。 この場合、シフトした2ビット分の情報がなくなります。 このために、反対方向にシフトしても、もとの情報は得られません。 こういうことなのでしょうか? あと、算術シフトに関連して、「符号部」という考え方はありません。単に、「符号ビット」です。 また、16進表記の点では、符号ビットを考慮しようがしまいが、 1110 1000 1010 1001(2)=E8A9(16) です。 これが、59561(10) なのか、-5975(10)が符号を考慮するかどうかの問題になります。

nVIDIA
質問者

お礼

浮動小数点の符号部が頭に上がってしまい、符号ビットを符号部と勘違いしていました。 符号を考慮するとかしないとかはまだ、指示がでていないのでそれはたぶんこれから詳しく習うと思います。 わかりやすい解説ありがとうございました。

  • inayou
  • ベストアンサー率30% (7/23)
回答No.1

左へnビットシフトする場合、元の数の2×n倍したことと同じになりま す。よってこれにより表わせる整数の範囲を超えてしまうことがあります。 そのため、思ったとおりの値が出てこないのだと思います。 右へnビットシフトする場合、元の数の1/(2×n)倍したことと同じにな ります。この場合算術シフトなので、16進にすると見かけ上増えてるように見えますが、実際は減っています。 例えば 1110 0000(2)=E0(16)=-32を右に1ビット算術シフトすると、 1111 0000(2)=F0(16)=-16 となり減っています。

nVIDIA
質問者

補足

符号部「1」も含めて、元にもどすのでしょうか?

関連するQ&A