はじめに
前回の記事
に続き本記事では「&=,|=,^=,<<=,>>=,>>>=」といった代入演算子について紹介します。
本記事は第一弾の下記の記事の知識があれば、左辺と右辺で演算した結果を左辺に代入する というポイントさえ覚えていただければ問題ないです。
「&=,|=,^=,<<=,>>=,>>>=」
①「&=」
左辺と右辺で論理積(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 |
こちらを実際のプログラムで見てみましょう。
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 |
こちらを実際のプログラムで見てみましょう。
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 |
こちらを実際のプログラムで見てみましょう。
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になります。
こちらを実際のプログラムで見てみましょう。
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になります。
こちらを実際のプログラムで見てみましょう。
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」 と同じ意味です。
②「>>=」との違いが分からない方は、下記の記事を読んでみてください。
a = -8、n = 1として「a >>>= n」で見てみます。
10進数で-8は11111111111111111111111111111000になります(32ビット)
11111111111111111111111111111000 >>> 1 の場合、
1ビット右にシフトして、先頭には0が入ります。
今回の場合先頭に0が入り、末尾の0が一つ消えて01111111111111111111111111111100になります。
これらの例を実際のプログラムで見てみましょう。
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
参考記事
読んでいただきありがとうございました。