C#用&进行按位运算来自C ++

时间:2012-08-02 21:02:17

标签: c# c++ bit-manipulation operator-keyword

嘿伙计们,所以我环顾四周,似乎无法找到答案,我猜我正在寻找所有错误的条款。

无论如何这里是我的问题我一直在修改整个C ++程序在C#中工作而且我已经完成了,我在C ++程序中有这个If语句

if(info[i].location & 0x8 || 
             info[i].location & 0x100|| 
                     info[i].location & 0x200)
{
    //do work
}
else
{
    return
}

当然,当我在C#中执行此操作时,它会给我一个“操作员'||'不能应用于'int'和'int'类型的操作数“error

关于我的问题是什么的任何线索,我猜测C#有一种方法可以做到这一点,因为我对这些旧的C运算符相当不熟悉

非常感谢

2 个答案:

答案 0 :(得分:10)

为何失败

从根本上说,它与此相同:

if (someInteger) // C or C++

VS

if (someInteger != 0) // C#

基本上,C#在逻辑运算符和条件方面要严格得多 - 它会强制您使用bool或可转换为bool的内容。

顺便说一下,那个为什么在C#中这不仅仅是一个警告,而是一个完整的错误:

int x = ...;
if (x = 10) // Whoops - meant to be == but it's actually an assignment

如果你看到这样的比较:

if (10 == x)

那些通常开发人员试图像上面那样避免拼写错误 - 但除非你真的与常量bool值进行比较,否则C#中不需要它。< / p>

解决问题

我怀疑你只需要:

if (((info[i].location & 0x8) != 0)) ||
    ((info[i].location & 0x100) != 0)) ||
    ((info[i].location & 0x200) != 0)))

您可能不需要所有这些括号...但另一种选择只是使用一个测试:

if ((info[i].location & 0x308) != 0)

毕竟,你只是测试是否设置了这三个位中的任何一个......

您还应该考虑使用基于标志的枚举:

[Flags]
public enum LocationTypes
{
    Foo = 1 << 3; // The original 0x8
    Bar = 1 << 8; // The original 0x100
    Baz = 1 << 9; // The original 0x200
}

然后你可以使用:

LocationTypes mask = LocationTypes.Foo | LocationTypes.Bar | LocationTypes.Baz;
if ((info[i].location) & mask != 0)

或使用Unconstrained Melody

LocationTypes mask = LocationTypes.Foo | LocationTypes.Bar | LocationTypes.Baz;
if (info[i].location.HasAny(mask))

答案 1 :(得分:4)

它几乎就是它所说的:在C#中,||是一个仅逻辑运算符,因此无法在int上运行。您可以将||替换为|(按位或对ints起作用),但是通过将整个表达式与零进行比较,需要将整个表达式转换为布尔值,因为在C#中if - 语句需要布尔值。

或者,您可以将info[i].location & 0x8替换为(info[i].location & 0x8 != 0)