我正在阅读"编程挑战:编程竞赛培训手册"一书,正在实现一个问题,我不理解运算符的使用c >> 1和比较if(n&1),有人可以帮助我知道它们的意思?
这是示例代码
#include <stdio.h>
#define MAX_N 300
#define MAX_D 150
long cache[MAX_N/2][2];
void make_cache(int n,int d,int mode)
{
long tmp[MAX_D];
int i,count;
for(i=0;i<MAX_D;i++) tmp[i]=0;
tmp[0]=1;count=0;
while(count<=n)
{
count++;
for(i=(count&1);i<=d;i+=2)
{
if(i)
tmp[i] = tmp[i-1] + tmp[i+1];
else if(!mode)
tmp[0]=tmp[1];
else
tmp[0]=0;
}
if((count&1)==(d&1))
cache[count>>1][mode]=tmp[d];
}
}
int main()
{
int n,d,i;
long sum;
while(1)
{
scanf("%d %d",&n,&d);
if(n&1)
sum=0;
else if(d==1)
sum=1;
else if(n<(d<<1))
sum=0;
else if(n==(d<<1))
sum=1;
else
{
make_cache(n,d,0);
make_cache(n,d,1);
sum=0;
for(i=0;i<=(n>>1);i++)
sum+=cache[i][0]*cache[(n>>1)-i][1];
}
printf("%ld\n",sum);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Eri*_*ric 15
>>将位移位到右n位.所以这:
1011 0101
Run Code Online (Sandbox Code Playgroud)
向下移1成为:
0101 1010
Run Code Online (Sandbox Code Playgroud)
&运算符按位进行,所以再次采取:
1011 0101
Run Code Online (Sandbox Code Playgroud)
&得到1(并且意味着两者必须是1,否则它是0):
1011 0101
&0000 0001
----------
0000 0001
Run Code Online (Sandbox Code Playgroud)
希望这有助于回答您的问题!
c >> 1是将它除以2(整数),并n & 0x1经常测试一个数字是否为奇数.
这里有一些文章:
http://irc.essex.ac.uk/www.iota-six.co.uk/c/e5_bitwise_shift_operators.asp
http://irc.essex.ac.uk/www.iota-six.co.uk/c/e4_bitwise_operators_and_or_xor.asp
| 归档时间: |
|
| 查看次数: |
9499 次 |
| 最近记录: |