【问题标题】:Bitwise Or: C# versus C++按位或:C# 与 C++
【发布时间】:2009-12-12 20:58:04
【问题描述】:

)。假设您有两个整数,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,当我给出一个数字时,能够确定它是什么标志。

【问题讨论】:

    标签: c# c++ boolean bitwise-operators


    【解决方案1】:

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

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

    if (2 & 8) ...         //  doesn't work
    
    if ((2 & 8) != 0) ...  //  works
    

    【讨论】:

    • Any1 有这个例子吗?
    • int 本身也不会在 C++ 中转换 to bool`,因为没有 bool 类型 - ints 用作 bools。跨度>
    • @Noldorin: 不是这样——C(在 C99 之前)没有 bool 类型,并且有一次(在标准化之前)C++ 也没有,但是 C 有 bool(从技术上讲它被命名为 _Bool) 已有大约十年了,而 C++ 的使用时间更长。
    • @Noldorin:我不知道你从哪里得到的。在 C++ 中有一个 bool 类型。每次你在条件上下文中使用任何东西时,它总是首先转换为bool类型。
    • 在 C# 中,|&bool 操作数有特殊含义。在这种情况下,& 不是按位“与”,而是逻辑且没有短路。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2022-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多