N&(1 << x)=何时为真?

Mar*_*nev 3 c++ bit-manipulation c++11

我最近一直在研究使用位操作生成子集的完整搜索,所以我偶然发现了以下代码:

for(int b = 0; b < (1<<n); b++) {
    vector<int> subset;
    for(int i = 0; i < n; i++) {
        if( b&(1<<i)) subset.push_back(i);
    }
    //use subset here
}
Run Code Online (Sandbox Code Playgroud)

此代码用于查找一组n元素的所有子集.我对这部分感到困惑

b&(1<<i)
Run Code Online (Sandbox Code Playgroud)

这是如果的第i位明显是假b0,但我不明白为什么它会是 true如果的第i位btrue,我的意思是不会结果只是2给力i(这因为它不等于一个即真,应该返回false)?

变化:在那旁边,我现在发现,我知道,任何数量从零不同的考虑true,那N & (1<<x) == true如果是真的x0N是奇数,或x>0N均匀,由于偏好==&,所以N & (1<<x) == true解析N & ( (1<<x) == true )

for*_*818 7

你有一个小小的误解......

因为它不等于一个即真,应该返回false)

事实是:只有在所有其他数字变为时才0转换为.falsetrue