C# 按位Or:C与C++;

C# 按位Or:C与C++;,c#,c++,boolean,bitwise-operators,C#,C++,Boolean,Bitwise Operators,)。假设有两个整数,a=8,b=2。在C++中,A是真的。我使用这种行为来处理标志集合。例如,标志将是1、2、4、8等等,并且它们的任何集合都是唯一的。我无法在C语言中找到这样的方法,因为和和操作符的行为不象C++中的那样。我阅读了有关C#中运算符的文档,但仍然不懂 编辑: 不幸的是,我似乎把事情搞砸了。以这段代码为例: byte flagCollection = 8; byte flag = 3; if ((flag | flagCollection) != 0) MessageBox.Sh

)。假设有两个整数,a=8,b=2。在C++中,A是真的。我使用这种行为来处理标志集合。例如,标志将是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,当我给出一个数字时,能够确定它是什么标志。

在C#中不同的不是按位和/或运算符。它们的工作原理和C++完全一样。不同之处在于,在C#中没有从整数到布尔值的隐式转换

要解决问题,只需将其与零进行比较:

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

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
与C/C++不同,C#在算术运算和布尔运算之间保持着相当严格的分离

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

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

<>我认为在C/C++ C++中做这件事可能不是一个坏主意,但我承认我当然不严格遵循这个建议(我也不会很努力地反对)。因为没有<代码> Boo.<代码> int > /Cuth> s被用作<代码> BOOL S.@ NOLDOLIN:不是这样的(C之前(C99))没有BoL类型,并且在一个时间(标准化之前)C++也没有,但是C已经有BoL(技术上它被命名为BoOL)大约十年了,而C++的时间更长了。我不知道你从哪里得到的。在C++中有一个<代码>布尔O/COD>类型。每次在条件上下文中使用任何东西时,它总是首先转换为
bool
类型。在C#中,
&
bool
操作数有特殊意义。在这种情况下,
&
不是按位的“and”,而是逻辑的且没有短路。