按位或:C#与C++的区别

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");

这个函数会针对任何flag值返回"y"。显然,3 | 8 的结果是11。我想要做的是创建一个flag集合:1、2、4、8、16,当我输入一个数字时,能够确定它包含哪些flags。

3个回答

14
在C#中,&|操作符与C/C++中的操作符相同。例如,2 | 8为10,2 & 8为0。
不同之处在于,int不能自动地像布尔值一样处理。在C#中,intbool是不同的类型。您需要将一个int与另一个int进行比较以获得一个bool
if (2 & 8) ...         //  doesn't work

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

有人有这个的使用示例吗? - Paul Creasey
在C++中,int并没有被直接转换为bool,因为C++中没有bool类型 - int被用作bool - Noldorin
6
不是这样的——在C99之前,C语言没有bool类型,并且在某个时期(在标准化之前)C++也没有,但是C语言已经有了bool类型(在技术上它被命名为_Bool)已经有大约十年的时间了,而C++则更长。 - Jerry Coffin
2
@Noldorin:我不知道你从哪里得到的信息。在C++中有一个“bool”类型。每次在条件上下文中使用任何东西时,它总是首先转换为“bool”类型。 - AnT stands with Russia
在C#中,|&对于bool操作数具有特殊含义。在这种情况下,&不是按位“与”,而是逻辑“与”而没有短路。 - jalf

8

C# 中的按位与/或运算符与 C++ 中的几乎相同,不同的是在 C# 中没有整数到布尔值之间的隐式转换。

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

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

5
与C/C++不同,C#在算术和布尔运算之间保持了相当严格的分离。
C#的设计者们认为将整数类型自动转换为布尔类型是错误的源头,他们希望C#没有这个问题,所以你必须通过引入比较来明确地将算术结果转换为布尔结果:
if ((a | b) != 0) {
    // ...
}

我认为在C/C++中这样做也许不是一个坏主意,但我承认我并不严格遵循这个建议(而且我也不会非常强烈地为它争辩)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接