Bitwise Or:C#与C++

Axo*_*onn 5 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");
Run Code Online (Sandbox Code Playgroud)

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

dtb*_*dtb 14

&|在C#运营商是相同的,如C/C++.例如,2 | 8是10并且2 & 8是0.

区别在于a int不会自动被视为布尔值. int并且bool是C#中的不同类型.你需要比较一个int到另一个int得到一个bool.

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

if ((2 & 8) != 0) ...  //  works
Run Code Online (Sandbox Code Playgroud)

  • @Noldorin:不是这样 - C(在C99之前)没有bool类型,并且曾经(在标准化之前)C++也没有,但C已经有bool(技术上它被命名为_Bool)大约十年,C++已经有了更长的时间. (6认同)
  • @Noldorin:我不知道你在哪里.在C++中有一个`bool`类型.每次在条件上下文中使用任何东西时,它总是首先转换为`bool`类型. (2认同)

Mar*_*ers 8

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

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

if ((a | b) != 0) {
   ...
Run Code Online (Sandbox Code Playgroud)


Mic*_*urr 5

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

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

if ((a | b) != 0) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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