)。假设你有两个整数,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,当我给出一个数字时,能够确定它是什么标志。
答案 0 :(得分:14)
C#中的&
和|
运算符与C / C ++中的运算符相同。
例如,2 | 8
为10,2 & 8
为0。
不同之处在于int
不会自动被视为布尔值。
int
和bool
是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>