静岡理工科大学 総合情報学部 (by 菅沼) 菅沼ホーム 目次

第1章 データ型と演算子

  1. 1.1 コメント(注釈)
  2. 1.2 データ型
    1. 1.2.1 リテラル
    2. 1.2.2 変数
  3. 1.3 算術演算子と代入演算子
    1. 1.3.1 算術演算子
    2. 1.3.2 代入演算子
    3. 1.3.3 インクリメント,デクリメント演算子
    4. 1.3.4 型変換( cast 演算子)
    5. (演習問題)
  4. 1.4 簡単なプログラム
      (プログラム例 1.1 ) 2 つのデータの和と差
    1. (演習問題)
  5. 1.5 その他の演算子
    1. 1.5.1 関係演算子,等値演算子,及び,論理演算子
        (プログラム例 1.2 ) 関係式と論理式
      1. (演習問題)
    2. 1.5.2 ビット演算子とシフト演算子
        (プログラム例 1.3 ) ビット演算とシフト演算
      1. (演習問題)

1.1 コメント(注釈)

  Java は,フリーフォーマットで書くことができる言語です.つまり,日本語などと同じように,一つの文を行内のどこから書き始めても,どこで終わっても構いません.文章内及び文書間には,単語を分割するような位置でなければ,適当な位置に,適当な数だけ区切り記号(スペース,タブ,改行など)を入れても構いません.また,日本語の場合,一つの文章が「.」や「。」で終わるように,Java においてはセミコロン( ; )で一つの文章が終了します.

  プログラムは,プログラミング言語で書かれた文書ですから,日本語などの文書と同様,最も重要な点は読みやすく,かつ,理解しやすいことです.しかし,プログラミング言語で書かれた部分だけでは,十分理解しやすい文書を書くことは難しいかと思います.そこで利用されるのが,日本語などの自然言語で書かれたコメント(説明,注釈,comment )です.コメントは,
/*
	変数 x に 10.0 を代入
*/
	x = 10.0;
		
のように,/* で始まり */ で終わります.コメントを複数行にわたって書くこともできますが,入れ子(ネスト)にすることは許されません.また,
// から行末まで
		
というコメントの書き方も許されます.例えば,
x = 10.0;      // 変数 x に 10.0 を代入
		
のように書く方法です./* と */ を使用した方法で書けば
x = 10.0;      /* 変数 x に 10.0 を代入 */
		
となります.

1.2 データ型

  数学における数式と同じように,Java においても,定数リテラル)や変数を使用できます.その意味するところは,数学の場合とかなり似ています.しかし,直接対応するものが数学にはない「データ型」という概念が存在します.

  プログラムの中で使用したリテラルや変数は,必ず,主記憶上のどこかに保存されます.また,保存される値が整数なのか,浮動小数点数(実数)なのか,文字なのか,さらに,保存するのに何バイト必要なのか等によって,保存する領域の大きさや表現方法が異なります.これらのことを規定するのがデータ型です.

1.2.1 リテラル

  リテラルには,整数リテラル浮動小数点リテラル文字リテラル文字列リテラル,および,論理型リテラルの 5 種類があります.リテラルの場合,そのデータ型は,定数の記述方法によって一意的に決まります.

  整数リテラルは,以下のように,10 進数,16 進数,または,8 進数で記述します.

10 進数: 0 以外の数字または +,- で始まる数字列(例えば,132,-34 等)
16 進数: 0x または 0X で始まる数字列(例えば,0xFD4C.なお,16 進数における a 〜 f は,大文字でも小文字でも構いません)
8 進数 : 0 で始まる数字列(例えば,0734 )

  例えば,1234 のように書けば,整数リテラルとみなされ,4 バイトの領域が確保されて記憶されます( int 型).int 型に入らないような大きな整数リテラルを書いた場合,自動的に long 型( 8 バイト)になります.また,強制的に long 型で記憶したいような場合は,例えば,1234L のように,数字の後ろに「 l (エル)」または「 L 」(接尾子)を付加することによって可能です.

  1234.0 のように,小数点を使用して数値を記述すると,それは浮動小数点リテラルとなり,8 バイトの領域が確保されて記憶されます( double 型).もし,多くの有効桁数を必要とせず,かつ,メモリを節約したい場合には,1234.0F のように,接尾子「 f 」または「 F 」を付けることにより,4 バイトの浮動小数で表現することも可能です( float 型).また,1234.0 を,1.234e+3 ( 1.234×10+3 の意味)のようにも表現可能です.

  文字リテラルは 'a',また,文字列リテラルは "abc" のように記述します.Java においては,Unicode を使用しているため,1 文字を表現するには 2 バイト必要になります.文字リテラルの中で,記号( \ )とそれに続く文字または数字の組み合わせをエスケープシーケンスと呼びます.端末やプリンタ上でのキャリッジリターンやタブなどの動作を指定するために使います.また,ダブルコーテーションマーク( " )など通常は特別な意味を持つ文字や,出力できない文字を表すときにも使用します.Java のエスケープシーケンスは,次のとおりです.
Seq.    名前              Seq.   名前
\udddd  Unicode文字       \?     リテラル クオーテーション
\b      バック スペース   \'     シングル クォーテーション
\f      改ページ          \"     ダブル クォーテーション
\n      復改              \\     円記号
\r      改行              \ddd   8進表記による ASCII 文字
\t      水平タブ          \xdd   16進表記による ASCII 文字
		
  また,Java には,truefalse だけの値を持つ論理型リテラルが存在します.後に述べる boolean 型変数に代入できるのは,この 2 つの値だけです.

1.2.2 変数

  変数は,数値や文字を保存するメモリ内の特定の領域に付けられた名前です.定数とは異なり,あらかじめそこに保存されるデータが常に決まっているわけではありません.しかし,データの型により,必要とする領域の大きさや表現方法が異なりますので,ある変数が示す領域に任意のデータを保存するわけにはいきません.前もって,その領域に保存すべきデータのを指定してやる必要があります.これを,変数の型宣言と言います.

  変数の型宣言は,以下のような形式で行います.
データ型 変数名1[= 初期値], 変数名2[= 初期値], ・・・;
		
データ型とは,char,int 等であり,例えば,変数 x の型を宣言するためには,基本的に,以下のいずれかの型を選択します.
型名           バイト数  値の範囲
byte             1       -128 〜 127
char             2       2バイトの文字
short            2       -32,768 〜 32,767
int              4       -2,147,483,648 〜 2,147,483,647
long             8       -9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807
float            4       3.4E±38(7 桁)
double           8       1.7E±308(15 桁)
boolean                  true, false
		
  変数が定義されただけでは,その変数が示す領域にどのようなデータが入っているかは未定です.もし,最初,その変数の領域に何らかの値を設定しておきたい場合は,初期値の項を記述してやることによって可能です(初期化初期設定).例えば,double 型変数 x の初期値を 10.5,変数 y の値を -4.5 としたい場合は,以下のように記述します.
double x = 10.5, y = -4.5;
		
  一般に,初期設定された変数であっても,同じ型の値であれば,プログラム内で任意の値を再設定することが可能です.しかし,
final int VAL = 10;
		
のように,final を使用することによって,変数 VAL の値を再設定することができなくなります.つまり,変数 VAL を定数のように使用することが可能になります.

  変数名としては,英字と数字を利用でき,小文字と大文字は厳格に区別されます(つまり,変数 a と変数 A は異なる変数とみなされます).ただし,第 1 文字は英字でなくてはなりません.また,下線 「 _ 」 は,英字に含まれ,例えば,english_test のように,長い変数名を読みやすくするためなどに使用されます.

  基本的には,変数名としてどのような名前を付けても構いませんが,以下に示すような,Java 言語の中で特別な意味を持っているキーワード予約語)を変数名として使用してはいけません.
abstract  boolean     break       byte        byvalue     case
cast      catch       char        class       const       continue
default   do          double      else        extends     false
final     finally     float       for         future      generic
goto      if          inner       implements  import      instanceof
int       interface   long        native      new         null
operator  outer       package     private     protected   public
rest      return      short       static      super       switch
synchronized          this        throw       throws      transient
true      try         var         void        volatile    while
		
  基本的に,Java で使用するすべての変数に対して,その変数が使用される前に,型宣言文を使用して,その型を定義してやる必要があります.宣言された変数を使用(参照,変更)できるのは,宣言された位置からその宣言が入っているブロック( { } で囲まれた部分等)の終わりまでです.また,ある変数が有効な範囲内で,同じ変数名を再定義することは許されません.

  たとえば,以下に示す例において,10 行目で定義されている変数 n,x,及び,y は,10 行目以降有効になります.しかし,変数 k の有効範囲は,for ループ( 30〜33 行目,後述)の中だけになり,34 行目における参照は,変数 k が定義されていないためエラーになります.
10	int n, x = 0, y = 1;
20	n = 10;
30	for (int k = 1; k <= 10; k++) {
31	  x += k;
32		y *= k;
33	}
34	n = k;   // エラー
35	int n;   // エラー,double n のように他の型でもだめ
		
  以上述べたことのまとめとして,型宣言文の例を挙げておきます.
int abc, _bef;   // 正.複数の変数をカンマで区切って並べることが可能
double abc, _bef = 3.5;   // 正.変数 _bef に対しては初期設定を行っている
int a, A;   // 正.変数 a と A は異なる
int a, abc, a;   // .同じ変数を 2 度定義してはいけない
int if;   // .キーワードは変数名として使用できない
int 10a;   // .変数名の最初は,英字または下線
int a+10;   // .変数名に使用できるのは,英数字と下線だけ
int a = 3.5;   // .int 型の変数の初期値として不適当
		

1.3 算術演算子と代入演算子

  C/C++ において使用できる演算子には,多くのものが存在しますが,この節では,その代表的なものについて説明します.

1.3.1 算術演算子

  プログラムを構成する最も基本的な処理は,定数と変数を使用し何らかの計算を行うことです.その際使用される算術演算子としては,以下のようなものがあります.

+ : 加算.文字列に対して使用すると,文字列の連結になる.  例: "abc" + "def" -> "abcdef"
- : 減算
* : 乗算
/ : 除算
% : 余り(整数演算に対してだけ使用可能)

数学の場合と同様に,これらの算術演算子と括弧を使用して,様々な計算を行うことができます.

  記述された計算式は,基本的に,左から順に計算されていきます.しかし,「+」や「-」は,「*」や「/」や「%」より優先度が低いため,「*」等より後に計算されます.しかし,括弧があれば,その中が最も優先的に計算される点は,数学の場合と同じです.

  しかし,整数同士の演算には十分注意して下さい.例えば,

10.0 / 4.0 * 2.0

と記述すれば,各定数は浮動小数点数として解釈され,10.0 を 4.0 で割った結果 2.5 に 2.0 が掛けられ結果は 5.0 になります.しかし,人間が計算する場合は同じであっても,

10 / 4 * 2

と記述すると,各定数は整数として解釈され,10 を 4 で割った結果 2 (整数計算であるので,結果も整数になり,この段階で,小数点以下が切り捨てられる)に 2 が掛けられ,結果は 4 になります.これは,定数だけでなく変数を含む演算であっても同様です.

  同じような演算とその結果を以下に示します.なぜ,そのような結果になるかを十分理解してください.

演算 説明
7 / 3 * 3 7 / 3 * 3 = 2 * 2 = 6
7 / (3 * 3) 7 / (3 * 3) = 7 / 9 = 0
7 / 3 / 3 7 / 3 / 3 = 2 / 3 = 0

  ここで,演習問題をやってみます.各演算の結果について答えてください.

(A) 10 / 3 * 5
(B) 10 / (3 * 5)
(C) 10 / 3 / 5

1.3.2 代入演算子

  プログラムによっては,演算した結果をどこかへ記憶しておき,その値を別の箇所で使用したいような場合がしばしば起こります.それを実現するのが代入演算子 = です.代入演算子の左辺は必ず変数でなければなりません.例えば,前節の 2 つの演算結果を double 型変数 data,及び,int 型変数 i_data に代入するためには,以下のように書きます.
data   = 10.0 / 4.0 * 2.0;
i_data = 10 / 4 * 2;
		
  右辺で演算した結果と,代入する変数の型が異なる場合は,演算結果を代入する変数の型に変換した後,代入されます.しかし,double 型を int 型に代入しようとすれば,小数点以下が切り捨てられ,本来持っている情報が失われます.従って,例えば,x を int 型,y を double 型の変数とした場合,
y = 10 / 4;
		
は許されますが,
x = 10.0 / 4.0;
		
は許されません.このような代入を行いたい場合は,後に述べる cast 演算子を利用してください.

  代入演算子は,一見,等号のように見えますが,等号ではないことに注意して下さい.例えば,
k = 2;
k = k + 3;
		
という 2 つの文が順に実行される場合を考えてみます.まず,最初の文の実行により変数 k に値 2 が代入されます.次に,2 番目の文により,現在の変数 k の値( = 2 )と 3 を加えた結果 5 が変数 k に代入されます.したがって,この時点で,変数 k の値は 5 になっています.明らかに,等号とは異なることが分かると思います.

  また,ある変数に関する演算と,結果のその変数への代入を同時に行う演算子が存在します.例えば,上の 2 番目の文は,
k += 3;
		
のようにも書けます.この演算子は,「-」,「*」,「/」,及び,「%」に対しても存在します.

  さらに,同じ値を複数の変数に代入したいとき,
x = y = z = 20.4;
		
のような記述が可能です.

  ここで,演習問題をやってみます.以下に示す順番で文が実行されたとき,4 行目の実行が終了した時点において,変数 x 及び y の値(変数 x 及び y に記憶されている値)について答えてください.
int x = 5, y;
x  = 3;
x *= 5;
y  = x + 2;
		

  この例からも明らかなように,各変数には,最後に代入または入力(後述)された値が記憶されています.ある変数に最後の代入または入力が行われた時点(例えば,3 行目)で,その変数( x )がそれ以前に記憶していた値(初期設定された 5 や 代入された 3 )はすべて失われます.

  先に述べたように,単に変数を定義した(型宣言した)だけでは,領域が確保されるだけであり,その変数に記憶されている値は未定です.例えば,上に示すプログラムの 1 行目において,変数 x の値は初期値によって確定しますが,y の値は未定です.変数の値が決まるのは,代入,又は,後に述べる入力文によってその変数に値が入力されたときです.上に示すプログラム例では,4 行目の実行が終了した後,変数 y の値が確定します.変数の値が確定する前に,その変数を参照するようなことは絶対に行ってはなりません.例えば,4 行目より前に,
x = y + 5;
		
のように,y の値を参照するような演算を行うことはできません.

1.3.3 インクリメント,デクリメント演算子

  1 だけ増やしたり減らしたりするのに,「++」(インクリメント演算子)や「--」(デクリメント演算子)といった演算子を使用できます.例えば,
k++;
n = 3 + m++;
		
のような使い方をします.1 行目は,
k = k + 1;
		
と同じ意味です.また,2 行目は,
n = 3 + m;
m = m + 1;
		
と同じ意味です.上の例では,「++」を変数の後ろに付けましたが,これは,現在の値を演算に使用した後,「++」の付いた変数の値を 1 だけ増加させることを意味します.しかし,「++」を前に付けると,その変数の値を 1 だけ増加させた後,演算に使用されます.例えば,
n = 3 + ++m;
		
は,
m = m + 1;
n = 3 + m;
		
と同じ意味になります.演算子「--」についても,1 だけ減少させる点を除き,「++」と同様です.

  ここで,演習問題をやってみます.以下に示す順番で文が実行されたとき,4 行目の実行が終了した時点において,変数 x 及び y の値(変数 x 及び y に記憶されている値)について答えてください.
int x = 5, y = 7;
x--;
x--;
y++;
		

1.3.4 型変換(キャスト(cast)演算子)

  演算は同じ型同士で行われ,また,代入も同じ型の変数に代入されるのが普通です.しかし,場合によっては,異なる型同士で演算したり,異なる型の変数へ代入したい場合が起こります.

  コンピュータは,基本的に,異なる型同士の演算を行うことができません.従って,そのような演算式が現れるとデータをいずれかの型に変換した後演算が行われます.例えば,
10.0 / 4;
		
のような計算は,整数定数 4 を浮動小数点数に変換した後,演算が行われ,結果は,浮動小数点数になります(この場合は,2.5 ).一般に,複数のデータ型が混在した場合,以下の関係で,より上位の型に変換されます.
char < int < long < float < double < ・・・
		
  また,代入の際は,代入すべき変数の型に変換され,代入が実行されます.例えば,db を double 型変数,k を int 型変数とします.このとき,
db = 10 / 3;
k  = 10.0 / 4.0;
		
のような代入を行うと,最初の文では,整数 10 を整数 3 で割った結果 3 が,浮動小数点数( double 型)に変換され,変数 db には 3.0 が代入されます.しかし,2 番目の文では,演算の結果 2.5 を整数に変換すると小数点以下の情報が失われるため,コンパイルエラーになってしまいます.

  このように,異なる型の処理は自動的な型変換により実行できますが,場合によっては,思いもかけないことが起こります.また,自動的型変換により,自分自身の型宣言の誤りに気付かないまま実行されてしまう場合も,しばしば起こります.従って,できるだけ自動的な型変換は使用せず,明示的に型を変換した方が良いと思います.それを行うのが,キャスト演算子( cast operator )です.キャスト演算子を変換したい定数または変数の前に付加して,希望の型に変換します.例えば,先の 2 番目の例では,以下のように記述すれば,変数 k に 2 が代入されます.
k  = (int)(10.0 / 4.0);
		
  また,以下に示す文において,変数 db1,db2 を double 型とします.
db1 = 10.4;
db2 = (double)((int)db1 / 4)
		
2 番目の文では,変数 db1 が int 型に変換された後,10 / 4 の整数演算が行われ,その結果が 2 となります.次に,整数 2 が double 型に変換され( 2.0 ),変数 db2 に代入されます.

  同じような演算とその結果を以下に示します.この例によって,キャスト演算子や自動的型変換について十分理解してください.

演算 説明
(double)(7 / 2) (double)(7 / 2) = (double)3 = 3.0
7 / (double)2 7 / (double)2 = 7 / 2.0 = 7.0 / 2.0 = 3.5
7 / 2.0 7 / 2.0 = 7.0 / 2.0 = 3.5
7 / 2 3

  ここで,演習問題をやってみます.以下の演算結果について,小数点以下第 1 位まで答えてください.

(A) (double)(13 / 2)
(B) (double)13 / 2
(C) 13 / 2.0

-------------------------演習問題開始-------------------------

  以上の説明で,算術演算,及び,代入の基本的な考え方が理解できたと思います.そこで,以下の演習問題をやってみてください.

-------------------------演習問題終了-------------------------

1.4 簡単なプログラム

  以上の説明により,クラスやメソッドに関する部分(入出力ではこれらを利用する)を除けば,簡単なプログラムを書けるはずです.第T部においては,クラスやメソッドに関する説明は行いませんので,以下に示す例の必要な部分(特に,説明を行っていない部分)をそのままコピーして利用してください.演習問題に解答する場合も,説明を行っていない部分を変更しないでください

  以下に示すプログラム例は,行番号部分を除き,Test.java というファイル名で保存した後,コマンドプロンプトから,
javac Test.java
		
のように入力すればコンパイルできます.エラーがなければ,Test.class というファイルが生成されます.その後,コマンドプロンプトから,
java Test
		
と入力すれば実行可能です.

(プログラム例 1.1 ) 2 つのデータの和と差 

[ 1 行に 2 つのデータを入力する場合の例]

  この例では,2 つのデータをスペースで区切り,1 行で入力しています.この例のように,複数のデータを 1 行に含めた場合は,プログラム内でそれらを分離してやる必要があります.

-------------------------演習問題開始-------------------------

  最初に,「書かれたプログラムを読み,各変数の値がどのように変化していくかを見る」ということを行ってみます.この能力は非常に重要です.作成したプログラムを実行し,結果が不適当であったような場合,自分でプログラムを読み,その流れを追ってみるのが基本的な方法です.これができなければ,もはやプログラムを書くことができないといっても過言ではありません.では,次の演習問題をやってみてください.

  では,自分でプログラムを書いてみましょう.最初の演習問題は,非常に簡単です.プログラム例 1.1 を少し修正するだけですみます.ただし,先のプログラム例では,double 型のデータを扱いましたが,次の演習問題では,int 型のデータを扱っている点に注意してください.

  また,最初に述べましたように,書かれたプログラムは,コンピュータによって自動的に正しいか否かの判断がなされます.そのため,上で与えたプログラム例とは少し異なった書き方をする必要があります.プログラムを送信する前に,「プログラムを書く際の注意事項」を十分読んでください.

  次に,もう少し複雑な計算を行うプログラムを書いてみましょう.以後のプログラムでも同様ですが,扱うデータは整数なのか,実数なのかを十分考えて変数の型宣言や定数を記述してください.

  今までの問題では,ほとんど考えることがなかったかと思います.以下の問題では,多少考える必要があるかと思いますが,「整数の除算」の性質をうまく使うと非常に簡単にプログラムを書くことができます.

-------------------------演習問題終了-------------------------

1.5 その他の演算子

1.5.1 関係演算子,等値演算子,及び,論理演算子

  関係演算子等値演算子は,2 つの数値を比較し,その結果に従い,boolean 型の値,真( true )または偽( false )を返す演算を行います.Java で使用できる関係演算子には,以下のようなものがあります.
>  より大きい  a > b   式 a の値が式 b の値より大きいとき真
<  より小さい  a < b   式 a の値が式 b の値より小さいとき真
>= 以上     a >= b  式 a の値が式 b の値以上のとき真
<= 以下     a <= b  式 a の値が式 b の値以下のとき真
		
また,等値演算子には,以下のようなものがあります.
== 等しい    a == b  式 a の値と式 b の値が等しいとき真
!= 等しくない  a != b  式 a の値と式 b の値が等しくないとき真
		
  論理演算子は,論理演算(論理和,論理積,否定)を行うための演算子であり,以下のようなものがあります.
|| 論理和  x || y  式 x が真か,または,式 y が真のとき真
&& 論理積  x && y  式 x が真で,かつ,式 y が真のとき真
!  否定    ! x      式 x が偽のとき真
		
  よく犯す誤りに以下のようなものがあります.例えば,x の値が 0 と 5 の間にあるか(つまり,数学的に書けば,0 < x < 5 )否かを調べたいとします.このとき,数学と全く同じように,
0 < x < 5
		
と書いてしまう人を多く見受けます.しかし,この記述は誤りです.「演算子は,前から順番に実行される」ということを思い出してください.上のように記述すると,まず,「 0 < x 」の演算が行われます.もし,x が 3 であった場合は,「 true 」という結果が得られます.次に,「 true < 5 」という演算が行われることになりますが,boolean 型と int 型の比較を行うことはできません.従って,目的とする判断を行わせるためには,
(0 < x) && (x < 5)
		
と記述してやる必要があります(カッコは必ずしも必要ない).

  最後に,条件演算子について触れておきます.例えば,「もし,y の値が 5 より大きければ,x に 10 を代入し,そうでなければ,20 を代入する」といった処理を行いたいとします.このようなとき,利用されるのが条件演算子です.条件演算子は,一般的に,
式1 ? 式2 : 式3
		
と書かれ,式1 が真のときは式2 の値がとられ,そうでなければ式3 の値がとられます.例えば,上で述べた例の場合は,
x = (y > 5) ? 10 : 20;
		
と書けば良いことになります.

(プログラム例 1.2 ) 関係式と論理式

11 〜 13 行目

  int 型変数 a,b,及び,x に対する型宣言と共に,初期値として,変数 a,b に,10,及び,20 を代入しています.

19 〜 23 行目

  出力文の「"」の中に記述した関係式・論理式に対する計算結果を出力をしています.19 行目では,「 a < x < b 」という関係をそのままでは記述できないことに注意して下さい.また,22 行目にあるように,等しいか否かを調べるのは,「==」であることに注意して下さい.「=」と書いてしまう場合がよく見受けられます.

  入力データとして,15 を与えると,このプログラムは以下の結果を出力します.
a < x < b ? true
x < a or x > b ? false
〜(x > a) ? false
a = b ? false
a ≠ b ? true
		

-------------------------演習問題開始-------------------------

  ここで,次の演習問題をやってみてください.

-------------------------演習問題終了-------------------------

1.5.2 ビット演算子とシフト演算子

  ビット演算子は,ビット毎の論理演算(論理和,論理積,排他的論理和等)を行うための演算子です.演算子で結合されたデータ(単項演算子の場合はデータそのもの)の対応するビット同士で与えられた演算を行います.以下に示すような演算子を使用できます.
| 論理和      x | y   対応するビットのいずれかが 1 のとき真.
& 論理積      x & y   対応するビットの双方が 1 のとき真
^ 排他的論理和 x ^ y   対応するビットが異なるのとき真
~ 1 の補数     ~ x      ビット毎に 1 と 0 を反転する
		
  論理和は特定のビットを 1 に設定,また,論理積はあるビット列だけを取り出す等のために使用されます.排他的論理和は,繰り上がりを無視した 1 ビット同士の加算に相当します.

  シフト演算子は,整数型または文字型のデータを表すビット列を指定された数だけ左,または,右にシフトするための演算子であり,次の 3 種類が存在します.
<< 左にシフト  x << 3  3 ビット左にシフト.x を 23 倍することに相当.
>> 右にシフト  x >> 3  3 ビット右にシフト.x を 23 で割ることに相当.
>>> 右にシフト  x >>> 3  符号ビットを含めて 3 ビット右にシフト
		
  左にシフトする場合は,下に示すように,指定された数だけビットをシフトした後,空いた場所に 0 が補充されます.
	11001111  →  3 ビット左にシフト  →  01111000
		
  しかし,右にシフトする場合は気を付ける必要があります.例えば,int 型には符号が存在します.最も左のビット(最上位ビット,符号ビット)は符号を表すため,>> によって右にシフトしても変化せず,空いた場所には符号ビットと同じビットが補充されます.しかし,>>> によってシフトすると,符号ビットもシフトされ,空いた場所には 0 が補充されます.
(1)>>  11001111  →  3 ビット右にシフト  →  11111001
(2)>>>  11001111  →  3 ビット右にシフト  →  00011001
		

(プログラム例 1.3 ) ビット演算とシフト演算 この例では,標準入力からの入力を行っていませんので,try や catch に関する部分が存在しません.標準入力からの入力を行わない場合は,今後,この例のように記述してください.

  このプログラムは以下の結果を出力します.ビット演算子とシフト演算子の働きを十分理解して下さい.
	ビット演算子
	   y1 1(1) y2 2(2)
	   z1 3(3) z2 fffffffd(-3)
	シフト演算子
	   y1 ffffffe8(-24) y2 18(24)
	   y1 fffffffd(-3) y2 1ffffffd(536870909)
		

-------------------------演習問題開始-------------------------

  以下は,ビット演算子及びシフト演算子に関する演習問題です.プログラム例4.3 を参考にすれば,簡単に解けると思います.

-------------------------演習問題終了-------------------------

静岡理工科大学 総合情報学部 (by 菅沼) 菅沼ホーム 目次 2.1節