Javaで競技プログラミングを始めなければ、一生使わなかっただろうメソッド、演算子があったのでQiitaの練習を兼ねて記事にします。
AtCoderに登録したら解くべき精選過去問10をJavaで解いてみたにて紹介されていた回答から興味を持ったメソッド、演算子をまとめます。
ABC 081 B - Shift Only
まずは以下の回答で使われていた、演算子の|=
メソッドのInteger.numberOfTrailingZeros()
です。
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int bit = 0;
for (int i=0; i<N; i++) {
bit |= sc.nextInt();
}
System.out.println(Integer.numberOfTrailingZeros(bit));
}
}
問題の内容は、与えられたN個の整数が全て偶数の場合、すべての整数を2で割った数に置き換える、この操作を何回繰り返す事ができるかが答えとなる問題でした。
ある数が偶数か判別する方法として、2進数にした際1の位が0であれば偶数と判断できます。
つまり、1の位から続く0の数が、その数の2で割る事ができる回数になります。
今回の回答では演算子の|=
を使って与えられた数すべてと論理和演算をする事で、与えられた整数の中で一番1の桁から続く0の数が少ない整数と同じ数だけ0の数を持った整数を作り出します。
1の位から続く0の数はInteger.numberOfTrailingZeros()
に代入する事で調べる事ができます。
演算子の|=
、メソッドInteger.numberOfTrailingZeros()
がとても面白く、印象に残る使い方だったため紹介させて頂きました。