• ベストアンサー

算術シフトの方法

1101(=-3)を算術シフトで1ビット右シフトしたときの結果についてご質問いたします。 この算術シフトを私が計算すると、1110 (=-2)となってしまいます。 しかし、本当は-3の1/2で、1111(=-1)と余りになるはずですよね? なぜ計算が正しくできないのか教えてください。 上記計算は、手持ちの本を参考に、以下のようにして行いました。 (1)1101の符号ビットを残して、右に1ビットシフト (2)空いたスペースに符号ビットを挿入し、1110を得る

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4851/10265)
回答No.2

右算術シフトが2のべき乗の割り算になるというのは間違ってはいませんが、 負の数を割ったときの商、余りの方法は決まっていません。 -3を2で割った場合、 -3 = -2*2 +1 ⇒ 商が-2で、余り+1 (余りは常に正) -3 = -1*2 -1 ⇒ 商が-1で、余り-1 (余りは被除数と同符号にする) どちらも正しいです。 算術シフトだと上の例になります。 プログラミング言語で整数除算機能を持っているものでも、言語により様々です。

RichardDD
質問者

お礼

なるほど、商、余りの求め方には二通りあるのですか。手持ちの参考書には記載ありませんでしたので、助かりました。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • maiko0318
  • ベストアンサー率21% (1483/6970)
回答No.1

算術シフトと1/2は違いますよ。 あなたの指摘したようになります。

RichardDD
質問者

お礼

どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

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

    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) 増えるはずが減って、減るはずが増えるというあべこべになってしまいます。 超基本的ことなんですが、なぜか本に記載されていなかったので書きました。ご協力ください。

  • 算術シフトについて

    基本的なことで申し訳ないのですが、コンピューターのシフト演算命令において、算術右シフトでは、なぜ「符号ビット」と同じビットを空いたビットに補充することになるのでしょうか?

  • 算術シフト演算が成り立つ理由がイマイチ・・・

    算術シフト演算で右シフトにしても左シフトにしてもシフトで空いたビットに符号ビットと同じ物を入れたり0を入れたり、溢れたビットを破棄したり・・・ というのがどうして成り立つのかがイマイチわかりません。 手元の本を見てもWebで探してもそういうことは細かく書かれていなくてよくわからないのです。 レポートで書かなければいけないのにこのままでは答えが出るのが間に合いそうもなく助けを借りたいと思い質問させて頂きました。 どなたかわかる人が居ましたらよろしくお願いします。

  • 「左算術シフト」について

    「算術シフト」についての質問です。 算術シフトには「右シフト」「左シフト」というものがあり、 「右算術シフト」の場合は、右シフトする時、一番左側の数(符号)が 「0」の場合→一番左側から「0」を補う。 「1」の場合→一番左側から「1」を補う。 ということですが、「左算術シフト」だとこんな感じでよろしいのでしょうか? 一番左側の数(符号)→そのまま(固定のまま) 二番目の左側の数(符号)→捨てる 三番目以降の左側の数(符号)→左へスライド 最後(一番右側)の数(符号)→右からゼロを補う ↑私の考えだと「左算術シフト」はこういうのものだと思いますが、こんな解釈でよろしいのでしょうか? よろしくお願いします。

  • 算術シフトについて

    10010010(2)を 左に二桁の算術シフト演算について いくらやってもテキストの解答と合いません(10100100) どうやったらでるのでしょうか? また左右の論理シフト演算、右算術シフト演算 の結果はそれぞれどうなるのでしょうか? また

  • ビットシフトについて

    12ビットのデータ(符号付き)を16ビットのデータに変換したいです。 自分なりに考えたのですが・・・ 最上位ビット(符号を表すビット)の位置が違うので左に4ビットシフト、 右に4ビットシフトします(どちらも算術シフトとします) 例  0000 1011 1101 0101 (12bit のデータ) →1011 1101 0101 0000 (左にシフト) →1111 1011 1101 0101 (右にシフト) こうするとたしかに16ビットのデータの最上位ビットには12ビットのデータの符号が 反映されるように思えるんですが、符号を除いた値そのものが変わってしまいますよね? どうしたらいいでしょうか 切羽詰まってて文章めちゃくちゃで分かりづらいかとは思いますが、解答よろしくお願いします。

  • シフト演算について

    基本情報技術者試験の資格試験のための勉強をしているものです。 現在、カテゴリー的には基礎理論の離散数学、 シフト演算のうち、「論理シフト」ではなく、 「算術シフト」で理解できない点があります。 左シフトは理解できたつもりなんですが・・・ 右シフトがいまいちよくわかりません。 以下に例題を表記します。 【10001100を2ビット左シフト】 先頭ビットは符号ビットということで、マイナスの数値になるのだと思います。すると、 【元の数】 10001100 =-(0001100) =-(8+4) =-12 【2桁左シフト結果=元の数×2^2】 10110000 =-(0110000) =-(32+16) =-48 となり、 元の数=-12 結果 =-48 で、結果が元の数×2^2で結果が合っているようです。 (と思っているだけなんですが) 元の数の考え方自体に間違いがありそうですが・・・ とりあえず進みます。 同様に 【10001100を2ビット右シフト】すると 【2桁右シフト結果=元の数×2^-2(=元の数×1/4)】 11100011 =-(1100011) =-(64+32+8+4) =-99 となり、 元の数=-12 結果 =-99 で、結果が元の数×2^-2(=元の数×1/4)と結果が合いません。 先頭符号を空いたビットに移動した部分は数えないのでしょうか。 すると、 元の値 =-12 結果  =-3 で結果が合う気がします。 過去の回答や検索サイトなどで調べてみましたがピンときません。 テキストにも、10進数での数値表記はなく、 答え合わせができなくて困っております。 どなたかお答えいただけると助かります。 どこが間違っているのか混乱しております。 先頭ビットが正負の符号ビットという前提の例題なのですが、 マイナス符号がついている前提となるので 先頭ビットや空いたビットに入れた符号ビットも含めて 「2の補数」で考える必要があるのかどうかも よくわからなくなってきました。 つまり、元の数値「10001100」は「-12」ではなく -(01110100) =-(64+32+16+4) =-116 なのでしょうか なお、C言語は今のところ学習していないので、 C言語にまつわるご回答ですともっとわからなくなりそうです。 単純に間違いを指摘していただけると大変助かります。 よろしくお願いします。

  • 情報処理の本を読んでいたんですが・・・

    この画像の左下に、右算術シフトで空いたスペースに入るのは、0決めうちじゃなくて符号ビットなのです。そうじゃないと左にシフトさせたらすぐオーバーフローですよ。 と書いてあるのですが、 「そうじゃないと左にシフトさせたらすぐオーバーフローですよ」 という部分がよくわかりません。 なぜ左シフトさせたらすぐオーバーフローになるのでしょうか・・・

    • ベストアンサー
    • Java
  • 2進数ビット列の算術シフトについて

    技術者向けでは基本的すぎて笑われてしまうかも知れません。が、プロの方で詳しい方にお聞きしたかったのです。例えば、プラスの数値を算術右シフトすれば 「あふれたビットを破棄するのは、その範囲で表現できないから切り捨てる。 たとえば3を2で割ると1.5ですが、 1右シフトすると1になりますが、 0.5を保持する桁がないからですね。 逆に桁あふれも同じ意味ですね。」という回答を見たのですが、確かにプラス部(負数でない部分)については理解出来るのですが、これがマイナスの整数(電算機上では負数)の場合、例えば「-1.5」であれば「-2」になるということでした。なぜ単純に「-0.5」部分の切り捨てで済まないのでしょうか?

  • シフト演算で質問です

    1バイトの 10010111を右に1シフトすると2^-1になるはずですが 151から75となり 2^-1になっていません。 なぜそうなるのでしょうか? これでは正確な演算を行うことができません。。。 よろしくお願いします! あと、論理シフトと算術シフトの使い分けもできれば教えていただきたいです!