Bitwise Or:C#vs C ++

时间:2009-12-12 20:58:05

标签: c# c++ boolean bitwise-operators

)。假设你有两个整数,a = 8,b = 2.在C ++ a |中b是真的。我使用该行为来处理标志集合。例如,标志将是1,2,4,8等,并且它们的任何集合都是唯一的。我无法在C#中找到如何做到这一点,作为|和&运算符的行为与C ++中的行为不同。我在C#中阅读了有关运算符的文档,但我仍然没有得到它。

编辑:

不幸的是,我似乎把事情弄得一团糟。以此代码为例:

byte flagCollection = 8;
byte flag = 3;

if ((flag | flagCollection) != 0) MessageBox.Show("y"); else MessageBox.Show("n");

对于我放入旗帜的任何值,都会返回“y”。这很明显,因为3 |嗯...我想要做的是有一个标志集合:1,2,4,8,16,当我给出一个数字时,能够确定它是什么标志。

3 个答案:

答案 0 :(得分:14)

C#中的&|运算符与C / C ++中的运算符相同。 例如,2 | 8为10,2 & 8为0。

不同之处在于int不会自动被视为布尔值。 intbool是C#中的不同类型。 您需要将int与另一个int进行比较才能获得bool

if (2 & 8) ...         //  doesn't work

if ((2 & 8) != 0) ...  //  works

答案 1 :(得分:8)

这不是C#中的按位和/或运算符。它们的工作方式几乎与C ++相同。不同之处在于,在C#中没有从整数到布尔值的隐式转换。

要解决您的问题,您只需要比较为零:

if ((a | b) != 0) {
   ...

答案 2 :(得分:5)

与C / C ++不同,C#在算术和布尔运算之间保持相当严格的分离。

C#的设计者认为将整数类型自动转换为布尔值是他们宁愿C#没有的错误来源,因此你必须通过引入比较来明确地将算术结果变为布尔结果:

if ((a | b) != 0) {
    // ...
}

我认为在C / C ++中做这个也不是一个坏主意,但我承认我当然不会严格遵循这个建议(我不会非常努力地争论)。 / p>