JavaSilverの試験で多分問われない演算子の話③

# はじめに
前回の記事

https://qiita.com/hiroki1994/items/466e8a8fd88d3d73bcb2


に続き本記事では「&=,|=,^=,<<=,>>=,>>>=」といった代入演算子について紹介します。
本記事は第一弾の下記の記事の知識があれば、**左辺と右辺で演算した結果を左辺に代入する** というポイントさえ覚えていただければ問題ないです。

https://qiita.com/hiroki1994/items/ab95ecdaf3a20cac9615





# 「&=,|=,^=,<<=,>>=,>>>=」



### ①「&=」

左辺と右辺で**論理積(AND)** を取った値を **左辺の変数に代入します**。

では「a &= b」で考えていきましょう。
これは **「a = a & b」** と同じ意味です。
a=1100、b=0101の場合下記の図のように、
論理積なのでab両方1の桁は1に。
それ以外の桁は、両方0もしくは片方が0なので0になります。

上記の**a & bの結果**を**変数aに代入**します。

|     |4桁目|3桁目|2桁目|1桁目|
|:-:|:-:|:-:|:-:|:-:|
|a|1|1|0|0|
|b|0|1|0|1|
|a & b|0|1|0|0|


こちらを実際のプログラムで見てみましょう。
```java:And1.java
public class And1
{
    public static void main( String[] args )
    {
		int a = 12; // 2進数 : 1100
		int b = 5; // 2進数 : 0101
        System.out.println("a &= b ：" + String.format("%4s", Integer.toBinaryString(a &= b)).replace(" ", "0"));
		System.out.println("a ：" + String.format("%4s", Integer.toBinaryString(a)).replace(" ", "0"));;

}
```

```ターミナル:実行結果
a &= b ：0100
a ：0100
```

### ②「|」
左辺と右辺で**論理和(or)** を取った値を **左辺の変数に代入します**。

では「a |= b」で考えていきましょう。
これは **「a = a | b」** と同じ意味です。
a=1100、b=0101の場合下記の図のように、
論理和なのでab両方1の桁はもちろん、片方が1の桁も1になります。
両方0の桁は0になります。

上記の**a | bの結果**を**変数aに代入**します。

|     |4桁目|3桁目|2桁目|1桁目|
|:-:|:-:|:-:|:-:|:-:|
|a|1|1|0|0|
|b|0|1|0|1|
|a \| b|1|1|0|1|

こちらを実際のプログラムで見てみましょう。
```java:Or1.java
public class Or1
{
    public static void main( String[] args )
    {
		int a = 12; // 2進数 : 1100
		int b = 5; // 2進数 : 0101

		System.out.println("a |= b ：" + String.format("%4s", Integer.toBinaryString(a |= b)).replace(" ", "0"));
		System.out.println("a ：" + String.format("%4s", Integer.toBinaryString(a)).replace(" ", "0"));;

}
```

```ターミナル:実行結果
a |= b ：1101
a ：1101
```

### ③「^」
左辺と右辺で**排他的論理和(xor)** を取った値を **左辺の変数に代入します**。

では「a ^= b」で考えていきましょう。
これは **「a = a ^ b」** と同じ意味です。
a=1100、b=0101の場合下記の図のように、
排他的論理和なので片方が1の桁は1になります。
ab両方1の桁、両方0の桁は0になります。

上記の**a ^ bの結果**を**変数aに代入**します。

|     |4桁目|3桁目|2桁目|1桁目|
|:-:|:-:|:-:|:-:|:-:|
|a|1|1|0|0|
|b|0|1|0|1|
|a ^ b|1|0|0|1|

こちらを実際のプログラムで見てみましょう。
```java:Xor1.java
public class Xor1
{
    public static void main( String[] args )
    {
		int a = 12; // 2進数 : 1100
		int b = 5; // 2進数 : 0101

		System.out.println("a ^= b ：" + String.format("%4s", Integer.toBinaryString(a ^= b)).replace(" ", "0"));
		System.out.println("a ：" + String.format("%4s", Integer.toBinaryString(a)).replace(" ", "0"));;

}
```

```ターミナル:実行結果
a ^= b ：1001
a ：1001
```

```ターミナル:実行結果
合格
```

# シフト演算子 「<<=」「>>=」「>>>=」

### ①「<<=」
「a <<= n」で**aを左にnビットシフトした値を変数aに代入します。**
これは **「a = a << n」** と同じ意味です。

a = 12、n = 1として「a <<= n」で見てみます。
10進数の12を2進数にすると1100です。

1100 << 1 は 1100を1ビット左にシフトします。
今回の場合、**11000**になります。


こちらを実際のプログラムで見てみましょう。
```java:Shift1.java
public class Shift1
{
    public static void main( String[] args )
    {
    	int a = 12;
		int n = 1;

        System.out.println(Integer.toBinaryString(a));
		System.out.println(Integer.toBinaryString(a <<= n));
        System.out.println(Integer.toBinaryString(a));
}
```

```ターミナル:実行結果
1100
11000
11000
```

### ②「>>=」
「a >>= n」で**aを右にnビットシフトした値を変数aに代入します。**(符号を考慮する算術シフト)
これは **「a = a >> n」** と同じ意味です。


a = 12、n = 1として「a >>= n」で見てみます。
1100 >> 1 は 1100を1ビット右にシフトします。
今回の場合、**110**になります。


こちらを実際のプログラムで見てみましょう。
```java:Shift2.java
public class Shift2
{
    public static void main( String[] args )
    {
    	int a = 12;
		int n = 1;

        System.out.println(Integer.toBinaryString(a));
		System.out.println(Integer.toBinaryString(a >>= n));
        System.out.println(Integer.toBinaryString(a));
}
```

```ターミナル:実行結果
1100
110
110
```
### ③「>>>=」

「a >>>= n」で**aを右にnビットシフトした値を変数aに代入します。**(符号を考慮しない論理シフト)

これは **「a = a >>> n」** と同じ意味です。
②「>>=」との違いが分からない方は、下記の記事を読んでみてください。

https://qiita.com/hiroki1994/items/ab95ecdaf3a20cac9615

a = -8、n = 1として「a >>>= n」で見てみます。
10進数で-8は11111111111111111111111111111000になります(32ビット)
11111111111111111111111111111000 >>> 1 の場合、
1ビット右にシフトして、先頭には**0**が入ります。
今回の場合**先頭に0が入り、末尾の0が一つ消えて01111111111111111111111111111100**になります。


これらの例を実際のプログラムで見てみましょう。
```java:Shift3.java
public class Shift3
{
    public static void main( String[] args )
    {
       	int a = -8; // 2進数(32ビット) :11111111111111111111111111111000
		int n = 1;

		System.out.println(Integer.toBinaryString(a));
		System.out.println(String.format("%32s", Integer.toBinaryString(a >>>= n)).replace(" ", "0"));
  		System.out.println(String.format("%32s", Integer.toBinaryString(a)).replace(" ", "0"));
}
```

```ターミナル:実行結果
11111111111111111111111111111000
01111111111111111111111111111100
01111111111111111111111111111100
```


参考記事

https://www.javadrive.jp/start/ope/index10.html

読んでいただきありがとうございました。