我最近一直在研究使用位操作生成子集的完整搜索,所以我偶然发现了以下代码:
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
}
此代码用于查找一组n
元素的所有子集。我对部分感到困惑
b&(1<<i)
如果b
的第i位是0
,那么这显然是错误的,但如果i-我不明白为什么它会true
b
的{{1}}位是true
,我的意思是结果只是2
i
的力量(因为它不等于false
一个即真,应该返回true
)?
更改:
除此之外,我现在注意到,我知道任何与零不同的数字都被视为N & (1<<x) == true
,如果x
为0
且N
为x>0
,则N
为真奇数,或==
和&
是偶数,因为N & (1<<x) == true
优先于N & ( (1<<x) == true )
,因此OptionMenu
会解析为import Tkinter as tk
optionList = ('a', 'b', 'c')
v = tk.StringVar()
v.set(optionList[0])
om = tk.OptionMenu(self, v, *optionList)
答案 0 :(得分:7)
你有一个小小的误解......
,因为它不等于一个,即true,应该返回false)
事实是:只有0
转换为false
,而所有其他数字变为true
。
答案 1 :(得分:3)
如果
b
的第i位是0
,那么显然是错误的,但如果{i}的第i位,我不明白为什么它会true
{1}}是b
,我的意思是结果只是true
2
的力量(因为它不等于一个,即为真,应该返回i
1}})?
这里的错误不是false
是1
而其他所有人都是true
。在C ++中,false
为0
,其他所有值均为false
。
答案 2 :(得分:3)
回想一下,当在需要逻辑表达式的地方(例如if
s或while
s)在C或C ++中使用数值表达式时,表达式结果将隐式地与零进行比较。返回零的表达式表示“false”,而返回非零的表达式表示“true”。他们不需要返回1
* 。
现在回想一下1 << i
使用二进制表示构造一个数字,该数字在第i个位置有一个1
。当&
- 位置b
的位为零时,执行具有此数字的数字b
的{{1}}会产生零。当位置i
中的b
位为1时,表达式将生成非零值,i
语句将其解释为“true”。
* 当C或C ++评估逻辑表达式(例如if
或!
)时,它会生成&&
,而不是任意非零数字。
答案 3 :(得分:0)
这是一个非常常见的混乱,你混合了两件事:
true
转换为1,false
转换为0 false
,其他任何内容都转换为true
。所以当你在int
或if
或任何其他需要布尔值的语句中使用结果为while
的表达式时,你会隐式地将其转换为bool
,因此第二种情况。这段代码:
if( b&(1<<i)) subset.push_back(i);
在逻辑上与:
相同bool flag = b&(1<<i);
if( flag ) subset.push_back(i);