java.util.Random源代码的第294行说
if ((n & -n) == n) // i.e., n is a power of 2
// rest of the code
为什么是这样?
该描述并不完全准确,因为(0 & -0) == 0
0不是2的幂。更好的说法是
((n & -n) == n)
当n是2的幂或2的幂的负数或零时。
如果n是2的幂,则二进制中的n是单个1,后跟零。-n为2的补数是倒数+ 1,因此位排成一行
n 0000100...000
-n 1111100...000
n & -n 0000100...000
要了解其工作原理,请将二进制补码视为逆+ 1。 -n == ~n + 1
n 0000100...000
inverse n 1111011...111
+ 1
two's comp 1111100...000
因为当您添加一个得到两个的补码时,您会一直进行到一个。
如果n不是2的幂,则结果将丢失一点,因为由于进位,两个补码的最高位不会置位。
†-或零或2的幂的负数…如顶部所述。
问题内容: 在Java中,表达式为: 似乎等于: 尽管是有效的一元运算符,其优先级高于中的算术运算符。因此,编译器似乎假设该运算符不能为一元运算符,并解析该表达式。 但是,表达式: 即使存在以下唯一有效的解决方案,也不会编译: 和被指定为具有相同的优先级,那么为什么编译器为支持算术而解决看似模棱两可的问题,但为什么不这样做呢? 问题答案: 首先使用最大修改规则将文件标记化(转换为标记序列)-始终获
我已经实现了两种从最高到最低排序元素的算法。 第一种方法在真实RAM模型上采用二次时间,第二种方法采用O(n log(n))时间。第二种方法使用优先级队列来获得缩减。 这里是计时,这是上述程序的输出。 > 尽管在复杂度上存在巨大差异,但就所考虑的数组大小而言,第三列要比第二列大。为什么会这样?C的优先级队列实现慢吗? 我在Windows7上执行了这段代码,VisualStudio2012是32位的
本文向大家介绍在C ++中找到(1 ^ n + 2 ^ n + 3 ^ n + 4 ^ n)mod 5,包括了在C ++中找到(1 ^ n + 2 ^ n + 3 ^ n + 4 ^ n)mod 5的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将解决以下问题。 给定一个整数n,我们必须找到(1 n +2 n +3 n +4 n)%5 如果n大,则数字(1 n +2 n +3 n +4
问题内容: 我编写了两种方法的代码,以找出LeetCode字符串中的第一个唯一字符。 问题陈述: 给定一个字符串,找到其中的第一个非重复字符并返回其索引。如果不存在,则返回-1。 示例测试用例: s =“ leetcode”返回0。 s =“ loveleetcode”,返回2。 方法1(O(n))(如果我错了,请纠正我): 方法2(O(n ^ 2)): 在方法2中,我认为复杂度应为O(n ^ 2
问题内容: 我试图实施Miller- Rabin素数测试 ,并且对为什么中型数字(〜7位数字)花费如此长时间(> 20秒)感到困惑。我最终发现以下代码行是问题的根源: (其中,和都是相似的,但不相等的中号,是幂运算符,并且是模运算符) 然后,我尝试将其替换为以下内容: 相比之下,它几乎是瞬时的。 对于上下文,这是原始功能: 定时计算示例: 输出(与PyPy 1.9.0一起运行): 输出(在Pyth
非常接近这个SO帖子,并在评论中询问,但在那里留下了不清楚。 和后缀是什么意思?