5

)。假设您有两个整数,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 | 8 将是 11。嗯......我想做的是收集一个标志:1、2、4、8、16,当我给出一个数字时,能够确定它是什么标志。

4

3 回答 3

14

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

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

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

if ((2 & 8) != 0) ...  //  works
于 2009-12-12T21:00:08.797 回答
8

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

要解决您的问题,您只需要与零进行比较:

if ((a | b) != 0) {
   ...
于 2009-12-12T20:59:30.793 回答
5

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

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

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

我认为在 C/C++ 中执行此操作也可能不是一个坏主意,但我承认我当然不会严格遵循该建议(而且我不会为之争辩)。

于 2009-12-12T21:03:43.583 回答