問題
次のコードをコンパイル、実行するとどうなりますか。
public class Main {
public static void main(String... args) {
var n = 0b0101;
var m = 0b0110;
int[] nums = { n, m, m & n, m | n };
for (int i : nums)
System.out.print(" " + i + " ");
}
}
選択肢
A)5 6 0 1 が出力される
B)5 6 0 1 が出力される
C)5 6 12 7 が出力される
D)コンパイルエラーになる
E)NumberFormatException がスローされる
F)5 6 4 7 が出力される
G)5 6 7 4 が出力される
H)5 6 15 4 が出力される
解答
A)5 6 0 1 が出力される
B)5 6 0 1 が出力される
C)5 6 12 7 が出力される
D)コンパイルエラーになる
E)NumberFormatException がスローされる
F)5 6 4 7 が出力される
G)5 6 7 4 が出力される
H)5 6 15 4 が出力される
解説
ビット演算子による論理積( & )と論理和( | )の問題です。
m & n の場合
&は、比較されている2進数のビット値の桁数の数字が同じならば1、異なれば0を返します。
以下のビット演算では、数字が同じならばマーカ赤色
異なればマーカー青色にわかりやすいように着色しています。
var n = 0b0101; //5
var m = 0b0110; //6
-----------------------
0b0100 //この2進数は「 4 」を意味する
m | n の場合
| は、2進数のビット値の桁数の数字を「OR(または)」で確認しています。
以下のビット演算では、以下のとおりで「 | 」で確認しています。
var n = 0b0101; //5
var m = 0b0110; //6
1桁目: n:1 OR m:0 → 1
2桁目: n:0 OR m:1 → 1
3桁目: n:1 OR m:1 → 1
4桁目: n:0 OR m:0 → 0
よって 、以下のとおりとなります。
var n = 0b0101; //5
var m = 0b0110; //6
-----------------------
0b0111 //この2進数は「 7 」を意味する
対象資格:Java SE17 認定資格