C# 长型、左档和右档操作

C# 长型、左档和右档操作,c#,.net,bitwise-operators,C#,.net,Bitwise Operators,继续我先前的问题 我发现了一个有趣的问题 第一步: 4294967296 & 0xFFFFFFFF00000000 结果:4294967296 第二步 4294967296 & 0x00000000FFFFFFFF 结果:0 啊哈,这里我假设4294967296==0xFFFFFFFF 让我们检查一下 (long)0x00000000FFFFFFFF 结果:4294967295。失败 让我们再检查一下 4294967296 >> 32 结果:1。失败 唯一的

继续我先前的问题

我发现了一个有趣的问题

第一步:

4294967296 & 0xFFFFFFFF00000000
结果:4294967296

第二步

4294967296 & 0x00000000FFFFFFFF
结果:0

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

让我们检查一下

(long)0x00000000FFFFFFFF
结果:4294967295。失败

让我们再检查一下

4294967296 >> 32
结果:1。失败

唯一的解释是,因为我用的是long where 一些位是为符号保留的。在C语言中,我将使用无符号long。 你们觉得呢,伙计们

4294967296 & 0xFFFFFFFF00000000 = 4294967296
这表示值4294967296在较低的32位中没有设置位。事实上,4294967296是0x100000000,所以这是真的

4294967296 >> 32 = 1
再次强调,一致性


换句话说,您认为4294967296是0xFFFFFFFF的结论是错误的,因此剩余的检查将不支持此结论。

我认为您未能理解按位
操作。按位
将返回在这两种方式中设置的位。如果两者是一样的话

(4294967296 & 0xFFFFFFFF00000000) == 4294967296


两者都可以,但它们显然不能。嗯。。。我不知道你为什么得出这样的结论,但4294967296是0x100000000。要以易读的十六进制写出按位AND

0x0000000100000000 &
0x00000000FFFFFFFF =
0x0000000000000000

0x0000000100000000 &
0xFFFFFFFF00000000 =
0x0000000100000000

这两种说法都很有道理。也许你误会了一个位和。。。它映射了两者中相同的位。您的评论似乎更适合按位异或,而不是按位AND(这不是您正在使用的操作)…

真丢人。谢谢但是我通过调试下面的代码得出了这个结论,这段代码的工作时间不长,a=2;长b=3;长包装=a+b您的问题是操作员的谨慎。加号在位移位之前处理。试试“长压缩=a+(b precidence=优先级,愚蠢的打字错误。我想我会更正,因为你可能想用谷歌搜索它;)一个看起来像…6的十进制数字不可能等于一个看起来像…F的十六进制数字。一个是偶数,一个是奇数!
0x0000000100000000 &
0x00000000FFFFFFFF =
0x0000000000000000

0x0000000100000000 &
0xFFFFFFFF00000000 =
0x0000000100000000