マンガで分かる Java入門講座

第4章 数値変数と演算子
4-6B. [コラム] シフト演算子

初心者にはちょっと高度な「シフト演算子」を紹介します。

● シフト演算子

 「シフト演算」は、特殊な計算方法です。シフト演算は、数値を2進数として見て、計算を行います。

 プログラムを書き始めた時には、このシフト演算はあまり使うことがありません。そのため、初めの内はこの内容は読まなくても構いません。

 シフト演算を行う記号は「シフト演算子」と呼びます。「<<」は「左シフト」、「>>」は「右シフト」と呼びます。

 たとえば「4」という数字は、2進数では「100」です。「<<」を使って「4 << 2」という計算を行うと、2進数の桁が2上がり「100」が「10000」になります。この結果、値は10進数で16になります。

 逆に「>>」を使って「4 >> 1」という計算を行うと、2進数の桁が1下がり「100」が「10」になります。この結果、値は10進数で2になります。

説明)シフト演算
4 << 2  →2進数で表記→  100 << 2  →   10000  →10進数で表記→  16
4 >> 1  →2進数で表記→  100 >> 1  →      10  →10進数で表記→   2

● 「>>」と「>>>」

 さて、右側にシフトする演算子は「>>」と「>>>」の2種類があります。

 このうち「>>」は符合を維持して値を小さくします。「>>>」は符合を無視してビットの値を右側に移動します。

 この処理の違いは変数のメモリ内の仕組みを理解する必要があります。

 Javaの数値変数では、値のメモリの先頭が0の場合には正の数、1の場合には負の数になっています。たとえば「凸凸凸凸」という4つのスイッチを使っている場合は、「0なら正で1なら負、数字用、数字用、数字用」となっています。

 マイナスの数字の場合は、「1 010」のように先頭が1になります。そのため、メモリ内の値を1つ右にずらして先頭を0で埋めると「0 101」となり、符合が変わってしまいます。しかし、「1 101」と符合が維持された方が都合がよいケースもあります。

 こういった問題に対処するために、右シフトには2つの記号が用意されています。

 「>>」では、符合を維持してシフト処理を行います。「>>>」では先頭を0で埋めてシフト処理を行います。

ソースコード)「>>」と「>>>」
System.out.println(-4 >> 1);	// 「-2」と出力
System.out.println(-4 >>> 1);	// 「2147483646」と出力

この講座のマンガ部分は「箱人形マンガ(Box Comic) 」で作成しています。
作成:2013/05/20  更新:2015/08/08  [Permalink]

クロクロ・ショップ
特殊な技術書多数あります
レトロ風RPG フルスクラッチ開発 全コード
レトロゲーム風RPGの全コードを掲載して解説した本
HTML5とJavaScriptで作る 落ち物パズルゲーム 全コード
『テトリス』や『ぷよぷよ』に類似した落ち物パズルゲームの全コードを掲載して解説した本
JavaScriptでリバーシゲームをつくろう
ライブラリを使わずに全コードを書いて、リバーシゲームを作るまでを徹底解説
ワールドマップ自動生成読本
二次元ゲームのワールドマップを自動生成するための本
レトロゲームファクトリー
過去のゲームを最新機に移植する会社のお仕事小説(新潮社)
顔貌売人 ハッカー探偵 鹿敷堂桂馬
プログラマーが探偵役のエンタメ・ミステリー第2弾 最先端の情報犯罪に安藤と鹿敷堂が挑みます(文藝春秋)
裏切りのプログラム ハッカー探偵 鹿敷堂桂馬
プログラマー鹿敷堂桂馬が、女性社長の安藤裕美と共に、IT業界で起きた事件に挑む。2016年の松本清張賞の最終候補作(文藝春秋)
×