长型,左移和右移操作

Cap*_*mic 0 .net c# bitwise-operators

继续我之前的问题 为什么我不能长期得出?

我发现了一个有趣的问题.

第一步:

4294967296 & 0xFFFFFFFF00000000
Run Code Online (Sandbox Code Playgroud)

结果:4294967296.

第二步.

4294967296 & 0x00000000FFFFFFFF
Run Code Online (Sandbox Code Playgroud)

结果:0

啊哈,所以我在这里假设4294967296 == 0xFFFFFFFF

让我们检查

(long)0x00000000FFFFFFFF
Run Code Online (Sandbox Code Playgroud)

结果:4294967295.失败.

我们仔细检查吧

4294967296 >> 32
Run Code Online (Sandbox Code Playgroud)

结果:1.失败.

唯一的解释是,因为我使用了很长时间保留一些符号.在CI中将使用unsigned long.你们觉得怎么样?

Tom*_*Tom 5

4294967296 & 0xFFFFFFFF00000000 = 4294967296
Run Code Online (Sandbox Code Playgroud)

这表示值4294967296在低32位中没有设置位.实际上,4294967296是0x100000000,所以这是真的.

4294967296 >> 32 = 1
Run Code Online (Sandbox Code Playgroud)

再一次,一致.

换句话说,4294967296为0xFFFFFFFF的结论是错误的,因此其余的检查不支持这一点.

  • 你的问题是操作员的预防.在位移之前处理Plus.试试"long packed = a +(b << 32);" (2认同)