对long进行逐位操作
本文关键字:位操作 long | 更新日期: 2023-09-27 18:29:18
我试图编译以下代码:
Int64 itag = BitConverter.ToInt64(temp, 0);
itag &= 0xFFFFFFFFFFFFFC00;
然而,这给了我以下错误:
运算符'&='不能应用于类型为"long"answers"ulong"的操作数
我该怎么做?
请参阅http://msdn.microsoft.com/en-en/library/aa664674%28v=vs.71%29.aspx。
如果文字没有后缀,则它具有可以表示其值的第一种类型:
int
、uint
、long
、ulong
。
你有
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。