N&amp; (1&lt; <x)true?=“”

时间:2017-05-23 14:44:39

标签: c++ c++11 bit-manipulation

=“”

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

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,如果x0Nx>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)

4 个答案:

答案 0 :(得分:7)

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

  

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

事实是:只有0转换为false,而所有其他数字变为true

答案 1 :(得分:3)

  

如果b的第i位是0,那么显然是错误的,但如果{i}的第i位,我不明白为什么它会true {1}}是b,我的意思是结果只是true 2的力量(因为它不等于一个,即为真,应该返回i 1}})?

这里的错误不是false1而其他所有人都是true。在C ++中,false0,其他所有值均为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
  • 整数到布尔值转换:0转换为false,其他任何内容都转换为true

所以当你在intif或任何其他需要布尔值的语句中使用结果为while的表达式时,你会隐式地将其转换为bool,因此第二种情况。这段代码:

if( b&(1<<i)) subset.push_back(i);

在逻辑上与:

相同
bool flag = b&(1<<i);
if( flag ) subset.push_back(i);