我等初级程序员,对二进制以及它的与或非运算神马的都太忽略了,今天突然看到一个二进制运算,觉得很好,记下来:
Java 的 Random 类中有个nextInt()方法,源码如下
public int nextInt(int n) {
if (n <= 0)
throw new IllegalArgumentException("n must be positive");
if ((n & -n) == n) // i.e., n is a power of 2
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;
}
要说的是第五行语句:“
if ((n & -n) == n) ”,是用来判断整n是否是2的幂次方的。
判断原理分析:
2的幂次方的整数,如:2、4、8、16...等,它们的二进制表示有个共同点:只有其中某一位是1,其他位都是0,如:
原码:0000 0000 0000 0010, 0000 0000 0000 0100, 0001 0000 0000 0000.....
反码:1111 1111 1111 1101, 1111 1111 1111 1011, 1110 1111 1111 1111.....
补码:0000 0000 0000 0010, 0000 0000 0000 0100, 0001 0000 0000 0000.....
我们知道,正整数 n 是用原码表示的,负整数 -n 是用 n 的补码表示的,
而2的幂次方的补码与原码必然相同,则2的幂次方 n & -n == n 必然成立。。。
思维扩展:数字之间的关系用二进制运算来判断应该挺高效的。。。