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)
它不是C#中的按位和/或运算符.它们的工作方式几乎与C++相同.不同之处在于,在C#中没有从整数到布尔值的隐式转换.
要解决您的问题,您只需要比较为零:
if ((a | b) != 0) {
...
Run Code Online (Sandbox Code Playgroud)
与C/C++不同,C#在算术和布尔运算之间保持相当严格的分离.
C#的设计者认为将整数类型自动转换为布尔值是他们宁愿C#没有的错误源,因此你必须通过引入比较显式地将你的算术结果变为布尔结果:
if ((a | b) != 0) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我认为在C/C++中做这个也不是一个坏主意,但我承认我当然不会严格遵循这个建议(我不会非常努力地争论).