今の時点で分かっている内容は
1<<2・・・1を二進数に表して、左に2ビット分シフトする。
if((4>>1&1)==1)・・・4を二進数100にして、右にビットシフトさせ、10となり、その一ビット目が1ならtrueを返す。
です。
問題は、これをどう解く方法として使うかです。
たとえば、http://judge.u-aizu.ac.jp/onlinejudge/d ... sp?id=0595(AOJ)の問題があって、
解答例として、参考にしていますコードは次の通りです。
int dp[1001][8];
int n;
string moji;
char num[1001];
int main()
{
cin>>n;
cin>>moji;
for(int i=0;i<n;i++)
{
if(moji[i]=='J')
{
num[i]=0;
}
else if(moji[i]=='O')
{
num[i]=1;
}
else
{
num[i]=2;
}
}
dp[0][1]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<8;j++)
{
if((j>>num[i-1]&1)==0)・・・①
continue;
for(int k=1;k<8;k++)
{
if((j&k)==0)・・・②
{
continue;
}
dp[i][j]+=dp[i-1][k];
dp[i][j]%=10007;
}
}
}
int ans=0;
for(int i=0;i<8;i++)
{
ans=(ans+dp[n][i])%10007;
}
cout<<ans<<endl;
return 0;
}
②は、jとkが両方含まれていなかったらfalseを返すのまではわかりました。
しかし、①はどういうことをしているのか全く分かりません。jをnum[i-1]ビット分右にずらし、1ビット目を見ることは、どういうことがわかるのでしょうか?
漠然とした質問すみません。
よろしくお願いしたします。