繁体   English   中英

Bitwise Or:C#与C ++

[英]Bitwise Or: C# versus C++

)。 假设你有两个整数,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嗯...我想做的是有一个标志集合:1,2,4,8,16,当我给出一个数字时,能够确定它是什么标志。

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

区别在于int不会自动处理为布尔值。 intbool是C#中的不同类型。 您需要将int与另一个int进行比较以获得bool

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM