• ベストアンサー

シフト演算子について・・・意味がわかりません(T_T)

左シフト演算子<<は最上位ビットの上位を削除して最下位に0を追加、 右シフト演算子>>は最下位ビットが削除されて、最上位ビットに最上位ビットと同じ値が補充される、 論理右シフト>>>は最下位ビット削除され、最上位に0が補充される。 と、ここまではわかりました・・・ ある問題で int n = -1>> 31; でnはいくつになるか?というのがあったんですが、 解説の意味がわかりません。 回答はー1です。 「>>演算子によるシフトでは符号ビットが拡張される」 意味がわかりません・・・(@_@) 「>>>演算子であったなら、符号ビットがゼロになるのでN=1となる」 え・・・???!!! ふごーびっと??? シフト演算子ですから、 「-1の31こ右にビットをシフトする」 んだな・・・と思ったところ、 まったくどう考えてよいのかわからず、 回答を見たところ、余計わからなくなりました。 だれかたすけてください(T_T)

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

  • ベストアンサー
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

右シフトの動作はこちらの通りです。 http://www.microsoft.com/japan/msdn/library/ja/jscript7/html/jsoprrshift.asp 右に1ビットシフトしたとき、全体のビットが右に1ビットシフトし、 最上位ビットには符号ビットが入ります。 -1は、全ビットが1で、符号ビット(MSB=最上位ビット)も1ですから、 何ビット右シフトしても常に-1です。

参考URL:
http://www.microsoft.com/japan/msdn/library/ja/jscript7/html/jsoprrshift.asp
azicyan
質問者

お礼

見逃していました! 右シフトの場合、 最上位にはシフト前の最上位ビットと同じ値が補充される、 とありました。 ありがとうございました!

その他の回答 (2)

  • MITSUSAN
  • ベストアンサー率0% (0/3)
回答No.3

MovingWalk様のお答えで正しいかと思います。 僕はJAVA経験がないのですが、この手の問題はC言語入門、アセンブリ言語入門でよく問われる問題です。 C言語入門的な書籍のシフト演算子の所を読めば分かりますよ!。 -1は内部的にはFFFFFFFF(h)で表現されている事(2の補数)と算術シフト(符号付)と論理シフト(符号無し)の違いに注意です。 (補足)2の補数の求め方:各桁を反転して最下位ビットに1を加えたもの。

azicyan
質問者

お礼

ありがとうございました。 やっとわかりました。 右シフトの場合と、左シフトの場合の違い、 1111 1111 1111 1111 1111 1111 1111 1111 がマイナス1になる、 ということがうまくわかっていませんでした。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

まず「2の補数」を理解する必要がありますね。 検索サイトで検索すれば見つかると思います。 後はすぐ理解できると思いますよ。

azicyan
質問者

お礼

もう少し考えました。 -1は 1111 1111 1111 1111 1111 1111 1111 1111 でしたね。 31ビット右シフトで・・・ やはり 1000 0000 0000 0000 0000 0000 0000 0000 -0(マイナス0)?????????

azicyan
質問者

補足

2の補数、ちょっと調べてみました。 8ビットで表現できる数は255。 しかし、これだとマイナスを表現できないから、 頭の一ビットを符号用とした。 よって数字部分は後の7ビットを使うから、 表現できる数は、-127~127。 理解が間違っている点はありますか? 問題の場合は31個シフトとありますが、 32ビット数字だと考えろ、ということですか? 1000000000000000000000000000001 (0が30個) 頭の1は符号ビットだから無視されるとして、 1000000000000000000000000000000 となってー0?(マイナス0???) うーーん。よくわかりません

関連するQ&A