プロが教える店舗&オフィスのセキュリティ対策術

JAVAで-100を「符号無し右シフト」により2だけシフトしたときの、出力結果について、できれば途中の計算過程も含めてご教授ください。

質問者からの補足コメント

  • 画像のように打ち込むと

    「符号無し右シフト」の補足画像1
      補足日時:2020/12/16 11:06
  • 画像のようになります。

    「符号無し右シフト」の補足画像2
      補足日時:2020/12/16 11:07

A 回答 (6件)

JAVAに関係なく10進数の-100を1右シフトすると半分になりさらに1右シフトするとさらに半分になります


単純に-100を2bit右シフトすると-25になります
逆に1左シフトすると倍になりさらに1右シフトするとさらに倍になります
またなぜそうなるのかは考えてみてください
わからなければまたアドバイスします
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2020/12/20 21:40

訂正


逆に1左シフトすると倍になりさらに1左シフトするとさらに倍になります
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2020/12/20 21:41

自分ではやらないんでしょうか?

    • good
    • 0

ぶっちゃけ、Javaかどうか、ってのは関係ねぇんだよなぁ。

「符号無し右シフト」の回答画像4
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
私が実行したものと、何かが違うんですかね?

お礼日時:2020/12/20 21:42

例えば、-45はJavaの内部表現では次のようになっている。



11111111111111111111111111010011

2つ符号なし右シフトすると次のようになる。

00111111111111111111111111110100

これは10進数で1073741812になる。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。
回答の迅速さに、ベストアンサーを送らせていただきます!

お礼日時:2020/12/20 21:44

Java 言語にて、


負数は「2の補数」形式の値 -> 正数をビット反転して1を加算した値
int 型は 32 ビット符号あり整数
符号あり整数は、最上位ビットが符号を表す
右シフトは右に移動する分だけ上位ビットへ補填が必要
符号あり右シフトは最上位ビットを考慮して補填する
符号なし右シフトは問答無用に 0 で補填する

というわけで "-100 >>> 2" の場合ならば
-> 1100100 // +100 の二進数
-> 00000000_00000000_00000000_01100100 // 32ビット幅に拡張
-> 11111111_11111111_11111111_10011011 // ビット毎に反転
-> 11111111_11111111_11111111_10011100 // 2の補数形式に
-> 0_11111111_11111111_11111111_1001110 // 右シフト補填は0
-> 00_11111111_11111111_11111111_100111 // もう一回
-> 1073741799 // 十進数に変換

"-100 >> 2" ならば、符号あり右シフトなので
-> 11111111_11111111_11111111_10011100 // -100 の二進数
-> 1_11111111_11111111_11111111_1001110 // 右シフト補填は1
-> 11_11111111_11111111_11111111_100111 // もう一回
-> -25 // 十進数に変換
    • good
    • 0
この回答へのお礼

大変わかりやすい説明、ありがとうございました。
スッキリしました!

お礼日時:2020/12/20 21:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!