blog

Java ビット演算子

コンピュータの最も基本的な用途の1つは、数学演算を実行することです。 コンピュータ言語として、Javaも変数を操作するための豊富な演算子セットを提供します。演算子は以下のグループに分けられます。 1....

Aug 8, 2020 · 7 min. read
Share this

コンピュータの最も基本的な用途の1つは数学的操作を実行することであり、コンピュータ言語としてJavaも変数を操作するための豊富な演算子セットを提供します。演算子は以下のグループに分けられます:

  • 算術演算子
  • 関係演算子
  • ビット演算子
  • 論理演算子
  • 代入演算子
  • その他の演算子

算術演算子

算術演算子は数式で使用され、数学と同じ目的を果たします。次の表は、すべての算術演算子の一覧です。

表の例では、整数変数 A の値が 10、変数 B の値が 20 であると仮定しています:

+ 加算 - 演算子の両辺の値を加算します。 A + B = 30
- 減算 - 左オペランドから右オペランドを引く A - B = -10
* 乗算 - 乗算演算子の両辺の値 A * B = 002
/ 除算 - 左オペランドを右オペランドで割ります。 等しい
% 剰余 - 左オペランドを右オペランドで割った値 B%A = 0
++ セルフインクリメント:オペランドの値が1増加します。 B++ ++B 21
-- 自己減少型:オペランドの値が1減少します。 B-- --B 19

自己加減乗除演算子 (SADO)

加算と減算の接頭辞: 加算または減算の操作を最初に行い、次に式の操作を行います。

接尾辞の加算と減算: まず式演算を行い、次に加算または減算演算を行います。

関係演算子

以下の表に、Javaでサポートされているリレーショナル演算子を示します。

表の例の整数変数Aの値は10で、変数Bの値は20です:

== 2つのオペランドの値が等しいかどうかをチェックし、等しい場合は条件が真になります。 は偽。
!= 2つのオペランドの値が等しいかどうかを調べます。 が真。
> 左オペランドの値が右オペランドの値より大きいかどうかを調べます。 は偽。
< 左オペランドの値が右オペランドの値より小さいかどうかを調べます。 が真。
>= 左オペランドの値が右オペランドの値以上であるかどうかを調べます。 は偽。
<= 左オペランドの値が右オペランドの値以下であるかどうかを調べます。 が真。

ビット演算子

Javaでは、整数型、長整数型、短整数型、文字型、バイト型などの型に適用されるビット演算子が定義されています。

ビット演算子はすべてのビットに作用し、ビット単位で動作します。仮にa = 60、b = 13とすると、その2進数表現は以下のようになります:

A = 
B = 
-----------------
A&B = 
A | B = 
A ^ B = 
~A = 
A << 2 = (2ビット左)
A >> 2 = (右から2ビット)
A >>> 2 = (右へ2ビットシフト、シフトによって得られた空ビットは0で埋められる)

次の表は、整数変数 A の値が 60、変数 B の値が 13 であると仮定した場合の、ビット演算子の基本操作の一覧です:

& 対応するビットが両方とも1なら結果は1、そうでなければ0 00000110です。
| 対応するビットが両方とも0の場合、結果は0となり、そうでない場合は1となります。 61を取得し、それは0011 0111です。
^ 対応するビット値が同じなら結果は0、そうでなければ1 49、つまり0011 0001
~ 逆バイビット演算子はオペランドの各ビットを反転させます。つまり、0が1になり、1が0になります。 つまり1100 1001
<< ビット単位の左シフト演算子。左オペランドは、右オペランドで指定されたビット数だけビット単位で左にシフトされます。 A << 2で240、つまり1111 0000
>> ビット単位の右シフト演算子。左オペランドは、右オペランドで指定されたビット数だけビット単位で右シフトされます。 A >> 2で15、すなわち1111
>>> シフト・ライト・バイ・ビット・ゼロ埋め演算子。左オペランドの値を、右オペランドで指定されたビット数だけ右にシフトし、シフトによって得られた空のビットをゼロで埋めます。 A>>>2 は15、つまり 0000 1111 になります。

論理演算子

次の表は、ブール変数Aが真、変数Bが偽と仮定した場合の論理演算子の基本操作の一覧です。

&& これは論理演算子と呼ばれます。条件は、オペランドが両方とも真である場合にのみ真となります。 は偽。
| | これは論理演算子または演算子と呼ばれます。2つのオペランドのいずれかが真なら、その条件は真です。 が真。
! 論理非演算子として知られています。オペランドの論理状態を反転させるために使用します。条件が真の場合、論理非演算子は偽になります。 !が真。

短絡論理演算子

with論理演算子を使う場合、オペランドが両方ともtrueのときは結果がtrueになりますが、1つ目の演算でfalseになったときは結果がfalseになるはずなので、その時点で2つ目の演算を判断することはありません。

代入演算子

Java言語では、以下の代入演算子がサポートされています:

= 右オペランドの値を左オペランドに代入する単純な代入演算子。 C = A + B は、A + B で得られた値を C に割り当てます。
+ = 左オペランドと右オペランドを加算し、その値を左オペランドに代入します。 C + = A C = C + A
- = 減算演算子および代入演算子。右オペランドから左オペランドを減算し、その値を左オペランドに代入します。 C - = A C = C - A
* = 乗算および代入演算子は、左オペランドと右オペランドを乗算し、その値を左オペランドに代入します。 C * = A C = C * A
/ = 左オペランドと右オペランドを除算し、その値を左オペランドに代入します。 これは、CとAが同じ型である場合、C = C / Aと等価です。
= モジュロ演算子および代入演算子で、左オペランドと右オペランドを受け取り、左オペランドに代入します。 Cパーセント=Aは、C=CパーセントAと同等。
<< = シフト C << = 2 C = C << 2
>> = シフト C >> = 2 C = C >> 2
&= とのビット演算 C = 2 C = C 2
^ = ビット毎または C ^ = 2 C = C ^ 2
| = とのビット演算 C | = 2 C = C | 2

条件演算子

条件演算子は三項演算子としても知られています。この演算子には 3 つのオペランドがあり、ブール式の値を決定するために必要です。この演算子の主な目的は、どの値を変数に代入するかを決定することです。

variable x = (expression) ? value if true : value if false
public class Test {
 public static void main(String[] args){
 int a , b;
 a = 10;
 // aに等しい1が成立する場合、bに20をセットし、そうでない場合は 30
 b = (a == 1) ? 20 : 30;
 System.out.println( "Value of b is : " + b );
 
 // aが10に等しい場合はbを20に設定し、そうでない場合は 30
 b = (a == 10) ? 20 : 30;
 System.out.println( "Value of b is : " + b );
 }
}

上記のコンパイル実行例の結果は以下の通り:

Value of b is : 30
Value of b is : 20

Java演算子の優先順位

式の中に複数の演算子が現れる場合、誰が最初で誰が最後なのでしょうか?ここで演算子の優先順位の問題が出てきます。複数の演算子からなる式では、演算子の優先順位の違いによって最終的な結果が大きく異なることがあります。

例えば、「+*2」という式は、プラス記号を最優先して計算すると「18」、掛け算記号を最優先して計算すると「14」という答えになります。

乗算演算子の方が加算演算子より優先順位が高いので、まず 3 * 2 を計算して 6 を求め、それから 7 を加算します。

以下の表では、優先順位の高いオペレーターが表の一番上に、優先順位の低いオペレーターが一番下にあります。

接尾辞 左から右
ユニコード expr++ expr-- 左から右
ユニコード ++expr --expr + - 右から左
乗法的 * /% 左から右
ユニコード + - 左から右
ユニコード >> >>> << 左から右
ユニコード > >= < <= 左から右
ユニコード == != 左から右
ユニコード & 左から右
ユニコード ^ 左から右
ユニコード | 左から右
ユニコード && 左から右
論理的または | | 左から右
条件付き ?:: 右から左
乗法的 = + = - = * = / = %= >> = << =&= ^ = | = = 右から左
カンマ 左から右
Read next

No articles found.

No articles found.