- 请先看看Random类中nextInt()方法的内部实现:
public int nextInt(int n) { if (n <= 0) throw new IllegalArgumentException("n must be positive"); <span style="color:#FF0000;">if ((n & -n) == n) // i.e., n is a power of 2</span> return (int)((n * (long)next(31)) >> 31); int bits, val; do { bits = next(31); val = bits % n; } while (bits - val + (n-1) < 0); return val; }
- 重点讲解红色标注部分,这里的注释写的很清楚,这行语句是说明n是2的幂次方的数,那么其究竟是怎么实现的?首先0是2的幂次方,在该方法的第一个if语句就已经实现,对于0要抛出异常;
<span style="color:#FF0000;">if ((n & -n) == n)的详解:<span style="background-color: rgb(255, 255, 255);">在计算机中比如说n是某一个2的幂次方的正数(在计算机中正数用原码表示),这里假定该数值是整形:那么n的形式为:</span></span>
反码: 11111111 11111111 11111111 01111111
补码: 11111111 11111111 11111111 1000000
- 计算机中负数用其正值得补码形式表达,那么红色标注的if语句的作用就很是清楚了,首先n 与 -n进行与操作,如果其值等同于 n ,那么就说明其是一个2的幂次方的数。后面的不做详解,有需要了解的请参照其实现原码。