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

左シフト演算子<<は最上位ビットの上位を削除して最下位に0を追加、
右シフト演算子>>は最下位ビットが削除されて、最上位ビットに最上位ビットと同じ値が補充される、
論理右シフト>>>は最下位ビット削除され、最上位に0が補充される。

と、ここまではわかりました・・・

ある問題で

int n = -1>> 31;

でnはいくつになるか?というのがあったんですが、
解説の意味がわかりません。
回答はー1です。
「>>演算子によるシフトでは符号ビットが拡張される」
意味がわかりません・・・(@_@)
「>>>演算子であったなら、符号ビットがゼロになるのでN=1となる」
え・・・???!!!
ふごーびっと???

シフト演算子ですから、
「-1の31こ右にビットをシフトする」
んだな・・・と思ったところ、
まったくどう考えてよいのかわからず、
回答を見たところ、余計わからなくなりました。

だれかたすけてください(T_T)

A 回答 (3件)

右シフトの動作はこちらの通りです。


http://www.microsoft.com/japan/msdn/library/ja/j …

右に1ビットシフトしたとき、全体のビットが右に1ビットシフトし、
最上位ビットには符号ビットが入ります。
-1は、全ビットが1で、符号ビット(MSB=最上位ビット)も1ですから、
何ビット右シフトしても常に-1です。

参考URL:http://www.microsoft.com/japan/msdn/library/ja/j …
    • good
    • 0
この回答へのお礼

見逃していました!

右シフトの場合、
最上位にはシフト前の最上位ビットと同じ値が補充される、

とありました。

ありがとうございました!

お礼日時:2003/10/03 00:59

MovingWalk様のお答えで正しいかと思います。


僕はJAVA経験がないのですが、この手の問題はC言語入門、アセンブリ言語入門でよく問われる問題です。
C言語入門的な書籍のシフト演算子の所を読めば分かりますよ!。

-1は内部的にはFFFFFFFF(h)で表現されている事(2の補数)と算術シフト(符号付)と論理シフト(符号無し)の違いに注意です。
(補足)2の補数の求め方:各桁を反転して最下位ビットに1を加えたもの。
    • good
    • 0
この回答へのお礼

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

やっとわかりました。

右シフトの場合と、左シフトの場合の違い、
1111 1111 1111 1111 1111 1111 1111 1111
がマイナス1になる、

ということがうまくわかっていませんでした。

お礼日時:2003/10/03 01:01

まず「2の補数」を理解する必要がありますね。


検索サイトで検索すれば見つかると思います。
後はすぐ理解できると思いますよ。

この回答への補足

2の補数、ちょっと調べてみました。

8ビットで表現できる数は255。
しかし、これだとマイナスを表現できないから、
頭の一ビットを符号用とした。
よって数字部分は後の7ビットを使うから、
表現できる数は、-127~127。

理解が間違っている点はありますか?

問題の場合は31個シフトとありますが、
32ビット数字だと考えろ、ということですか?
1000000000000000000000000000001
(0が30個)
頭の1は符号ビットだから無視されるとして、
1000000000000000000000000000000
となってー0?(マイナス0???)

うーーん。よくわかりません

補足日時:2003/10/02 22:16
    • good
    • 0
この回答へのお礼

もう少し考えました。

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

お礼日時:2003/10/02 22:44

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