ビット単位演算子と論理演算子 は、これらのシフト演算子を使ったビット操作の結果をわかりやすくまとめた一 覧です。 表 3.7 32 ビット整数に対するビットシフト操作の結果 0000 0000 0000 0000 0000 0000 0110 0011 0000 0000 0000 0000 0000 0011 0001 1000 0000 0000 0000 0000 0000 0000 0001 1000 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1001 1 101 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1001 0000 0000 0000 1 1 1 1 1 1 1 1 1 1 1 ー 1 1 1 1 1 1 1 1 1 x の初期値は 99 x くく 3 の実行後 ( 792 ) x > > 2 の実行後 ( 24 ) y の初期値は -99 y > > 4 の実行後 ( -7 ) y > > > 12 の実行後 ( 1048575 ) 3 解説 ヒン 32 ビットよりも小さいデータ型にビット操作を行うと、コンバイラ によってすべてのオペランドが 32 ビットに拡張されてから演算が実 行されることに注意してください。 シフト演算子については、もう 1 つだけ注意すべき点があります。 32 ピットの 整数をシフトする式で右のオペランドが 32 よりも大きい場合、コンパイラは下位 5 ビット ( つまり 0 ~ 31 ) しか使いません。ビットの整数をシフトする場合は、右 オペランドの下位 6 ビット ( つまり 0 ~ 63 ) しか使いません。 代入付きのシフト演算とビット単位の演算 算術演算子の場合と同じように、シフト演算子やビット単位演算子でも代入演 算子 ( = ) を組み合わせて使えることに注意してください。演算の結果は、予想のと おりです。 整数に使う & 、ト ^ (AND 、 OR 、 XOR) 演算子は、 b001e 値に対して使っても 期待どおりに作用します。左右のオペランドがどちらも bo 。 le 型ではない場合 は、コンパイルエラーになります。試験に必ず出るといっても過言でないのは & & 論理式の演算子 61
第 3 章基本データ型とオブジェクトへの演算子の作用 表 3.6 sho 型整数 ( 16 ビット整数 ) に適用されるビット単位の演算 2 進数 0000 0000 0101 0100 00000001 01000111 0000 0000 0100 0100 0000 0001 0101 0111 0000 0001 0001 0011 1 1 1 1 1 1 10 1011 1000 演算 opl 0P2 0P1 & op2 opll 0P2 0P1 ^ 0P2 ~ 0P2 10 進数 84 327 68 343 275 ー 328 16 進数 0x0054 0x0147 0x0044 0x0157 0x0113 0xFEB8 ビット操作を使ったプログラム作成の経験があまりない場合は、小 さな Java プログラムをいくつか書いてビット単位の演算に慣れて おきましよう。ⅲ tege 「ラッパークラスと Long ラッパークラスに は、ビット単位の操作の結果を扱うのに便利なメソッド t0BinaryString( ) と t0HexString( ) が用意されています。 単項補数演算子 ~ 演算子は、 int 型整数に適用されます。値が int 型よりも小さい場合は、 int 型に 変換した後で演算が行われます。この演算子を使うと、各ビットが反転されます。 ! 演算子を boolean 型の値に使うと、 false はⅲ re に、または re は false に変わり ます。 シフト演算子 > > 、 > > > 、くく これらのシフト演算子は、基本データ型の整数型にしか使えません。左のオペラ ンドを右のオペランドで指定されたビット数だけシフトする演算子です。シフト演算 子を使うときに注意する必要があるのは、シフトで生じる新しいビットの値です。くく ( 左シフト ) 演算子の場合、下位に生じる新しいビットの値は常にゼロです。 int 型 の整数では最上位ビットは符号なので、 Java には 2 種類の右シフト演算子がありま す。 > > 演算子を使うと、既存の符号ビットが拡張されます。つまり、シフトを行っ ても負数は負数のままです。 > > > 演算子は、上位ビットにゼロを挿入します。表 3.7 60
ビット単位演算子と論理演算子 ビット演算子の効果を調べるためには、さまざまな値のビットパターンを紙に 書き出すと便利です。正確なビットパターンを得るには、 16 進数の 1 桁に相当す る 4 ピットごとにグループ分けするとよいでしよう。ビット単位の演算子に関す る問題を解くためにすべての論理規則を丸暗記している必要はなく、部分的に 知っていれば役に立つでしよう。次に示すコード例では、 & (AND) 演算子を使っ ています。 / / 0000 0000 0001 0100 または 0X0014 short flags = 20 / / 0000 0000 0000 0100 short mask 4 (short) ( flags & mask ) short rslt オペランドがⅲ t 型または long 型に拡張されるので、この値を sho れ型変数 rslt に代入するには sho れ型へのキャストが必要です。 AND 演算子を適用すると、変 数 rslt のビットパターンは 080 008 開 018 または 10 進数の 4 になります。次 に示すコード例の 1 行目のようにステートメントを使ってビット単位の演算の結 果をチェックする場合、 Java では 2 行目の論理ステートメントのように b 。 olean 型 の値しか使えません。 C プログラマは、まどわされないように注意してください。 / / C では正しいが、 Java では誤り if ( rslt ) d0Something ( ) ー / / どちらでも正しい if( rslt ! = 0 ) d0Something() 表 3.6 は、さまざまなビット単位演算子を各種オペランドに適用した結果を示す 一覧です。最後の行の ~ 演算子 ( 補数演算子 ) は、最上位ビットを 1 にします。その 結果、整数は負の値になります。表を見やすくするためにここでは sh 型を使っ ていますが、どの整数データ型でも同じ規則が適用されます。 3 解説 59
第 1 0 章標準ライブラリューティリティクラス 表 10.1 ラッパークラスとそれに対応する基本データ型変数 ラッパークラス対応する Java 基本データ型値 Byte Short Character lnteger Long Float Double Boolean る ! byte short Char int long float double boolean 値 8 ビット符号付き整数 16 ビット符号付き整数 16 ビット符号なし Unicode 整数 32 ビット符号付き整数 64 ビット符号付き整数 32 ビット浮動小数点数 64 ビット浮動小数点数 true または false これらのラッパークラスには、 Java の基本データ型と比べて「先頭 が大文字である点だけが異なる」というものが多いので、間違えや すくなっています。オブジェクトと基本データ型を取り違えないよ うに注意してください。 ラッパーオプジェクトの一般的な使用方法 ラッパークラスを使うと、基本データ型値を操作するためのオプジェクトを扱 う数多くの Java ユーティリティクラスを使用できます。たとえば、電卓アプリケー ションを作成する場合には、中間結果をスタック上に DoubIe オプジェクトとして 保存することができます。 JavaS ね ck オプジェクトの動作については、この章で後 public static int parse 工 nt ( String s ) ジェクトをⅲ t 型値に変換するために使います。 よく使う static メソッドを次に示します。これらは、ユーザー入力の String オプ lnteger クラス ほど説明します。 246 public static int parse 工 nt ( String s, int radix )
ビット単位演算子と論理演算子 ( 続き ) 優先度 演算子 説明 演算子の型 左シフト 右シフト ( 算術シフト ) 右シフト ( 論理シフト ) オブジェクトの生成元の ロい 等号 ( 同一オブジェクト ) 不等号 ( 同一オブジェク トではない ) ビット単位の AND 論理 AND ビット単位の XOR 論理 XOR ビット単位の OR 論理〇日 論理 AND ( 条件 ) 論理 OR ( 条件 ) 条件式 代入 左シフトと代入 右シフトと代入 右シフト、ゼロ詰め、代入 ビット単位の AND と代入 論理 AND と代入 ビット単位の OR と代入 整数 くく 整数 整数 左辺 : オブジェクト、 instanceof 右辺 : 対象クラス名 オブジェクト オプジェクト 整数 論理 整数 論理 整数 諞理 論理 論理 論理 変数、任意 2 進数 2 進数 2 進数 2 進数 論理 2 進数 乙・ -4-- 4 ・ LO 6 6 O ィーワ」 CO CO CO ( 0 CO ( 0 「 / マ / 8 8 0) -1 ・ 3 解説 57
索引 stop( ) メソッド . ... 221 ffread クラス . … 217 概要 .. ... 216 クライアント / サーバープログラミング .. 387 コンストラクタ . … 218 最後 .. ... 221 作成 .. … 218 終了 .. … 221 推奨されないメソッド . … 229 スリープ . … 221 デッドロック . ... 223 同期 .. … 223 入出力のプロック . マルチタスクとマルチスレッド .. メソッド . 優先度 .. ライフサイクル . ソースコード 構造 .. コメント . … 23 ソケット . … 520 待機セット . 待機リスト . 代入… 代入可能 ... タイミング、ユーティリティクラス . タイムスタンプ .. 多重継承 ... ダブルバッファリング、 Graphics クラスと オフスクリーン .. 単項演算子… ... 520 … 520 ... 520 ... 520 … 248 … 520 … 520 … 216 ... 230 ... 220 ... 217 … 298 … 520 整数 型間のキャスト . ビット演算子 .. 浮動小数点数型からのキャスト .. 整数型変数… 生成、例外の .. 再生成 .. 制約 ... 絶対的な位置決め .. 宣言、クラスの . 血キーワード . static イニシャライザ .. キーワード . クラスの本体 . コンストラクタ . コンポーネント . 修飾子の制限 .. 抽象クラス .. プログラムの構造 .. ローカル変数 .. 宣言、配列の . 初期化 .. 同時に初期化する . .. 137 チェックされる例外 .. 抽象クラス CollectionsAPI . Component クラス . Container クラス .. 宣言 .. 抽象パス名 . ... 521 ... 58 , … 29 .. 137 … 2 ... 274 … 281 ... 171 .. 172 .. 355 , 519 ... 520 .. 521 … 83 ... 82 , 83 データ型 .. 基本 .. 参照変数 .. デーモンスレッド . 定義 インタフェース . .. 1 開 低レベルイベント . ... 521 ディープコピー … 521 ディレクトリ関係のメソッド、入出力 .. … 372 テキスト入力 Component クラス . デクリメント . デコレータ . 8 1 ... 92 8 9 6 6 … 279 … 51 , 521 .. 521 538
Java のデータ型 整数型 表 2.3 は、整数型の特徴を一覧にまとめたものです。これらの特徴をしつかり覚 えておく必要があります。符号付きの数値として扱われない唯一の整数型が ch であることに注意してください。 ch 型は、 U ⅲ code 文字を表します。整数型の メンバ変数の初期値は、デフォルトではゼロです。 表 2.3 整数型と値の範囲 内容 型 値の範囲 サイズ 2 解説 8 ビット 16 ビット 16 ビット 32 ビット 64 ビット -128 ~ 127 -32768 ~ 32767 YUOOOO ~ VuFFFF 符号付き整数 符号付き整数 符号なし Unicode 文字 符号付き整数 符号付き整数 byte short Char int long 浮動小数点数型 表 2.4 は、浮動小数点数型の特徴をまとめた一覧です。浮動小数点数型に関する 問題では、この型の変数の初期化と操作方法についての理解を問われる傾向があ ります。浮動小数点数型のメンバ変数には、初期値としてデフォルトでゼロが与 えられます。 表 2.4 浮動小数点数型 型 内容 32 ビット 単精度旧 EE 標準 float 64 ビット 倍精度 IEEE 標準 double およその最大値と最小値 サイズ 3.4X1038 ~ 1 .4x10-45 1 .8 x 10308 ~ 4.9x 10-324 boolean 値型変数 boole 皿型の値は、 frue と false のどちらかです。 boole 型のメンバ変数には、 初期値として se が与えられます。 c の整数型とは異なり、 Java の整数型を boole 29
ストリームフィルタ トラクタは推奨されなくなっています。ただし、 System. out ストリームを使用で きなければならないので、ほかのメソッドは引き続き使用できます。プログラマ は p ⅱ n ⅳ eam クラスの代わりに P ⅱ ntW ⅱ ter クラスを使うことが推奨されます。 ーストリームと文字 Java の String オプジェクトと ch 型では、国際化をサポートするために 16 ビッ ト U ⅲ code 文字を使います。しかし、標準ライプラリの Java ソースコードファイ ルや、一般的な開発環境で作成されるソースファイルはすべて 8 ビットバイトで、 一般に 7 ビット ASCII コードを使っています。 DataInputStream などのオプジェク トが ASC Ⅱテキストを 16 ビット文字に解釈する際には、単にすべて 0 の上位バイ トを追加します。 P ⅱ ntS 仕 eam が 16 ビット文字を書き込む際には、単に上位バイト を削除します。 UTF-8 工ンコーディングシステムは、 7 ビット ASCII と 16 ビット Unicode の橋 渡しを行います。 UTF-8 工ンコードテキストファイルは、いくつかの単純な規則 に従って解釈されるバイトから構成されます。バイトの上位ビットが 0 の場合は c Ⅱ文字と見なされますが、上位バイトが 1 の場合は、 16 ビット文字を作成する マルチバイトシーケンスの一部として解釈しなければなりません。「¥ u0020 」から 「¥ u0()7F 」までの Unicode 文字は、 ASCII および IS0885 1 ( レⅱ n -1 ) 工ンコーディ ングと同等です。 1 つの文字は、 1 バイト、 2 バイト、 3 バイトのいすれかでエンコードされます。 ファイル内で UTF -8 でエンコードされた文字の数とバイト数の間には直接的な関 係がないので、読み取りと書き込みを行うメソッドは、次に示すような特殊な形 式を使います。 > void writeUTF(Stri ng s) Da ね Output インタフェースで指定されているメソッド。 2 バイト符号なし整 数の St 「 ing オプジェクトの長さを書き込み、その後に文字をエンコードする バイトを書き込みます。 > - String readUTF( ) Da 回 nput インタフェースで指定されているメソッド。まず 2 バイトを読み込 んでその後に続く文字の数を取得し、その数の文字をデコードして String オ プジェクトに追加するまでストリームを読み込んで解釈していきます。 379
第 3 章基本データ型とオブジェクトへの演算子の作用 ( 続き ) 優先度演算子 演算子の型 論理 2 進数 論理 論理 OR と代入 ビット単位の XO 日と代入 論理 XOR と代入 (f) CO CO ービット単位の演算子と整数 ビット単位の演算子を使うと、 AND 、 OR 、 XOR ( 排他的 OR ) 演算の規則に従っ て、整数の各ビットを変更することができます ( 表 3.5 を参照 ) 。 & 、ト ^ 演算子の オペランドは、必要に応じてⅲ t 型または long 型に拡張され、演算の結果は、 boolean 型ではなく int 型または long 型になります。整数の各ビットを個別に変更したり チェックすることができるので、これらの演算子は多くの情報を狭い領域に集約 する目的でよく使われます。 表 3.5 ビット単位の論理規則 オペランド 演算子 AND AND AND AND OR OR OR OR XOR XOR XOR XOR オペランド 結果 一 1- O -1- O ィー O ィー O ィー O -1 ー O 1 1 ・ O O O ィー O O ィー 1 1 0 58
第 6 章基本データ型とオプジェクトの変換とキャスト 変数の初期化 ( 第 2 章 ) と算術式 ( 第 3 章 ) の説明の中で、各種の Java 基本データ 型の変換規則についてはある程度学習しました。この章では、これらの型の変換 とキャスト操作の使い方について、より体系的に説明します。 Java の参照変数は、 クラス、インタフェース、配列を参照できます。参照変数の変換とキャストに関 する規則についても学習します。 基本データ型の変換とキャスト 算術式であれ、リテラルであれ、メソッド呼び出しであれ、すべての Java の式 には型があります。式の結果をほかの式で使うとき、あらたに変数を作り代入す るか、別の型に変えなければならない場合があります。 Java のコンパイラにはあ る程度の型の変換を自動的に処理する機能がありますが、プログラム内で特定の キャストが指定されていないとコンパイルエラーになる場合もあります。この節 では、コンパイラで型の変換がどのように扱われるかについて解説します。 一般論として言えば、 Java コンパイラでは、値の精度が失われない種類の型変 換は自動的に処理されます。また、整数型から浮動小数点数型への変換に関して は、浮動小数点数形式では整数を完全には表現できないために、精度が多少失わ れることがあります。 符号付き整数の変換 符号付き整数の変換は、符号ビットを拡張する方法で実行されます。したがっ て、負の値は、値を保ったまま sho れ型、ⅲ t 型、または long 型に変換できます。 もちろん、整数が正の値の場合は、符号ビットの値 0 が拡張されるので、値は正 のまま変換されます。 int 型の整数 ( 32 ビット ) またはそれよりも小さい整数は、浮動小数点数型に変換 できますが、 float 型では 32 ビットを使って指数部分の情報も表現しなければなら ないので、値の精度が失われる可能性があります。 32 ビットよりも小さい整数は、 まず 32 ビットの int 型に変換されてから float 型に変換されます。同じように、整 ー拡張変換 134