Java中Random类的nextInt()方法详解

2023-04-11 15:55:56
  1. 请先看看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>
             原码:00000000 00000000 00000000 10000000

                      反码: 11111111    11111111   11111111    01111111

                      补码:  11111111   11111111   11111111    1000000

  • 计算机中负数用其正值得补码形式表达,那么红色标注的if语句的作用就很是清楚了,首先n 与 -n进行与操作,如果其值等同于 n ,那么就说明其是一个2的幂次方的数。后面的不做详解,有需要了解的请参照其实现原码。
  • 作者:Ma_Jack
  • 原文链接:https://blog.csdn.net/u013272948/article/details/51004246
    更新时间:2023-04-11 15:55:56