在浏览代码时,我看到了这一点。
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(i & (1<<j))
{
//code
}
}
}
任何人都可以知道这个循环是如何工作的? 我知道正确的部分将是pow(2,j),但我不明白将如何&amp;在这里工作。
答案 0 :(得分:1)
它循环遍历从0
到n
的所有值,并且对于每个值:
它循环遍历值中的每个位。如果设置了值:
它执行//code
让我们检查复杂的部分:
if(i & (1<<j))
1<<j
是设置j
位(从零开始)的常用方法。如果是j==0
,那么它是0b00001
,如果是j==3
那么它是0b01000
。然后i & <bit>
评估为<bit
&gt;如果该位在i
中设置,则计算结果为0
。因此,这会检查j
中是否设置了i
位。
触发代码的值对包括:
i binary js
0 000
1 001 0
2 010 1
3 011 0, 1
4 100 2
5 101 0, 2
6 110 1, 2
etc...
31 11111 0, 1, 2, 3, 4,
注意二进制文件中的1如何镜像代码触发的j值。
请注意,如果n>=32
,它会尝试将值移动太远,以及未定义的行为。确保没有发生。