Java получить остаток от сдвига бита - PullRequest
1 голос
/ 08 января 2020

Поскольку все мы знаем, что есть угощение для получения остатка для:

m = остаток

n = число

d = делитель, положительное целое число

m = n & (d - 1)

Работает для d = 2 ^ k (k - положительное целое число)

Для JDK 12 я использую jmh для проверить эффективность:

@State(Scope.Thread)
public static class Generator {
    SequentialGenerator sequentialGenerator = new SequentialGenerator(1, Integer.MAX_VALUE);
    SequentialGenerator powerGenerator = new SequentialGenerator(1, 17);
}

@Benchmark
@Warmup(iterations = 1)
@Measurement(iterations = 120)
public void mod2_1(Generator generator) {

    int pow = generator.powerGenerator.nextValue().intValue();
    int factor = 1 << pow;
    int i = generator.sequentialGenerator.nextValue().intValue();

    for (long j = 0; j < 1000L; j++) {
        int k = i & (factor -1);
    }
}

@Benchmark
@Warmup(iterations = 1)
@Measurement(iterations = 120)
public void mod2_2(Generator generator) {

    int pow = generator.powerGenerator.nextValue().intValue();
    int factor = 1 << pow;
    int i = generator.sequentialGenerator.nextValue().intValue();

    for (long j = 0; j < 1000L; j++) {
        int k = i % factor;
    }
}

Результат показывает, что% более эффективен, чем &, почему:

Benchmark                 Mode  Cnt        Score       Error  Units
BitUtilTest.mod2_1       thrpt  120  1218565.022 ± 32816.798  ops/s
BitUtilTest.mod2_2       thrpt  120  2045390.684 ± 56090.355  ops/s
...