这些天,在许多算法挑战的解决方案部分,我看到这个特定的短语1<<j
,有时作为for循环的退出条件,
这些i<(1<<n)
和1<<j
的重要性是什么?
例如:
for(i=0;i<**(1<<n)**;i++)
{
sum=0;
for(j=0;j<n;j++)
{
if(i&**(1<<j)**)
{
sum+=a[j];
}
}
if(sum==m)
{
flag=1;
break;
}
}
编辑:通过“什么是1<<j
”,我的意思是循环的程度如何?
答案 0 :(得分:1)
在二进制系统中,2的幂表示1
后跟零。例如:
2 5 = 32 (十进制)= 100000 (二进制)
如果您想计算2的幂,请将1
个位置向左移动几个。左移将填补&#34; new&#34;零的地方:
1&lt;&lt; 5 (C / Java表示法)= 100000 (二进制)= 32 (十进制)= 2 5 强>
因此,您可以使用左移作为计算2的幂的简单方法。
你无法计算例如3很容易。例如,以下C代码将计算3的幂:
(int)(pow(3.0, 5.0) + 0.5)
如果要将其用作循环终止条件,则需要转换为int
(或其他合适的类型)。这种转换看起来很丑陋,并且可能会出错(如果省略+ 0.5
)。
因此,如果你需要2的幂,而不是任何其他数字,那么使用左移更容易。