LoginSignup
0
0

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

Posted at

はじめに

前回の記事

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

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

①「&=」

左辺と右辺で論理積(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

こちらを実際のプログラムで見てみましょう。

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

こちらを実際のプログラムで見てみましょう。

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

こちらを実際のプログラムで見てみましょう。

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になります。

こちらを実際のプログラムで見てみましょう。

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になります。

こちらを実際のプログラムで見てみましょう。

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」 と同じ意味です。
②「>>=」との違いが分からない方は、下記の記事を読んでみてください。

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

これらの例を実際のプログラムで見てみましょう。

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

参考記事

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0