对long进行逐位操作

本文关键字:位操作 long | 更新日期: 2023-09-27 18:29:18

我试图编译以下代码:

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

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

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

我该怎么做?

对long进行逐位操作

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

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

你有

0xFFFFFFFFFFFFFC00

但Int64.最大值为:

0x7FFFFFFFFFFFFFFF

所以CCD_ 5不够大并且CCD_。

现在左边有一个Int64,它是有符号的,右边有ulong,但是,接受该组合的&=没有过载,这会导致错误。

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

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

有符号和无符号的"数字"不能混合匹配,Int64是有符号的,所以这是不可能的。

我会这样做:

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

itag是一个长。CCD_ 11是一个ulong。您正试图在&=语句中混合使用这两种语句,但这不起作用。

为什么你的字面意思是ulong?MSDN表示:

如果文字没有后缀,那么它有第一个可以表示其值的类型:int、uint、long、ulong。

由于数字对于int、uint或long来说太大,因此您的文字将变为ulong。

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

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

这会让你的ulong变成(负)long。

C#语言规范第7.11.1节的整数逻辑运算符如下所示:

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

int运算符&(int x,int y);

uint运算符&(uint x,uint y);

长运算符&(长x,长y);

ulong运算符&(ulong x,ulong y);

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

问题是您试图将&=作为long作为ulong

只需将Int64替换为ulong即可解决问题,因为这样您就可以将&=应用于2个ulong s。