据我所知,有三种方法可以在c中使用布尔值
#define FALSE 0 ... #define TRUE !(FALSE)我错过了其他方法吗?不同方法的优缺点是什么?
我想最快的是3号,2号更容易读取(尽管按位否定会略微增加开销),1是最易读的,与所有编译器不兼容.
我最近一直在研究使用位操作生成子集的完整搜索,所以我偶然发现了以下代码:
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位明显是假b的0,但我不明白为什么它会是 true如果的第i位b是true,我的意思是不会结果只是2给力i(这因为它不等于一个即真,应该返回false)?
变化:在那旁边,我现在发现,我知道,任何数量从零不同的考虑true,那N & (1<<x) == true如果是真的x是0和N是奇数,或x>0和N均匀,由于偏好==过&,所以N & (1<<x) == true解析 …