肺部按位操作

时间:2012-03-29 11:50:45

标签: c# long-integer bitwise-operators

我试图编译这段代码:

Int64 itag = BitConverter.ToInt64(temp, 0);
itag &= 0xFFFFFFFFFFFFFC00;

然而,这给了我以下错误:

  

运算符'& ='不能应用于'long'和'ulong'类型的操作数

我该怎么做?

6 个答案:

答案 0 :(得分:4)

请参阅http://msdn.microsoft.com/en-en/library/aa664674%28v=vs.71%29.aspx

  

如果文字没有后缀,则它具有可以表示其值的第一种类型:intuintlongulong。< / p>

你有

0xFFFFFFFFFFFFFC00

但是Int64.Max是:

0x7FFFFFFFFFFFFFFF

所以long不够大,ulong被视为文字的类型。

现在左侧有一个Int64,已签名,右侧有ulong,但&=没有超载接受该组合,这会导致错误。

答案 1 :(得分:3)

C#对整数文字使用最小的拟合类型,而0xFFFFFFFFFFFFFC00太长,所以它是一个ulong。

因此要么将itag转换为ulong,要么将0xFFFFFFFFFFFFFC00转换为long(未选中)。

答案 2 :(得分:1)

有符号和无符号的“数字”不能混合匹配,而且Int64已经签名,所以它是禁止的。

我会这样:

UInt64 itag = BitConverter.ToUInt64(temp, 0); //note the added 'U' to make it unsigned
itag &= 0xFFFFFFFFFFFFFC00; //Now types match, they're both unsigned.

答案 3 :(得分:1)

itag很长。 0xFFFFFFFFFFFFFC00是一个ulong。您试图在&=语句中混合两种语句,但这不起作用。

为什么你的文字是ulong? MSDN says

  

如果文字没有后缀,则它具有这些类型中的第一个,其值可以表示为:int,uint,long,ulong。

由于数字对于int,uint或long来说太大,你的文字就变成了一个ulong。

您有两种选择:将itag声明为ulong,如其他人所建议的那样,或者(按位)将您的文字转换为long:

itag &= unchecked((long)0xFFFFFFFFFFFFFC00);

这会使你的ulong溢出到(负)长。

答案 4 :(得分:1)

C#语言规范的第7.11.1节整数逻辑运算符读取:

  

预定义的整数逻辑运算符为:

     

int operator&amp;(int x,int y);

     

uint operator&amp;(uint x,uint y);

     

长算子&amp;(长x,长y);

     

ulong operator&amp;(ulong x,ulong y);

如您所见,long(只是Int64的别名)和ulong之间没有预定义的运算符,因此出错。

答案 5 :(得分:0)

问题在于您尝试&= long ulong

只需将Int64替换为ulong即可解决问题,因为您正在将&=应用于2 ulong