我正在研究一些C ++代码,我需要将其翻译成C#,在原始代码中有这一行:
if(!(Bchild[j>>6] & (1i64 << (j % 64))))
其中j是某个数字&lt; 10000.Bchild是一个UInt64
在C#中,我找不到任何相当于1i64的内容,但是,我即兴创作,我认为可以像这样重写代码:
if ((Bchild[j >> 6] & Convert.ToUInt64((1 << (j % 64)))) == 0)
现在我收到一个错误:值太大或太小。我的第一部分问题是:我做得对吗?若然,那么:1i64的C#等价物是多少?因为我认为这是产生运行时错误的主要问题
注意:我正在使用64X操作系统而当执行接近62,63,64时(1&lt;(&lt;(j%64)))给出这样的数字:9223372036854775808
答案 0 :(得分:0)
我做得对吗?
没有。 Convert.ToUInt64((1 << (j % 64))
转换移位的结果,而不是参数。
1i64的C#等价物是什么
您可以使用1L
代替1i64
,或1UL
代替1ui64
。
C++
中有符号整数的左移是未定义的行为。 (根据最新标准,您的具体情况是可以的,假设1i64 << 63
可以在相应的无符号类型中表示。)