1
Help us understand the problem. What are the problem?

posted at

updated at

Javaで競技プログラミングをする際に見つけた面白いメソッド、演算子

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()がとても面白く、印象に残る使い方だったため紹介させて頂きました。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?