在C#中C ++ 1i64移位的等价性是什么?

时间:2015-07-04 08:20:11

标签: c# c++ migration bit-shift

我正在研究一些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

1 个答案:

答案 0 :(得分:0)

  

我做得对吗?

没有。 Convert.ToUInt64((1 << (j % 64))转换移位的结果,而不是参数。

  

1i64的C#等价物是什么

您可以使用1L代替1i64,或1UL代替1ui64

顺便说一句,请注意,在某些情况下,C++中有符号整数的左移是未定义的行为。 (根据最新标准,您的具体情况是可以的,假设1i64 << 63可以在相应的无符号类型中表示。)