按位移位 - 在C#.net与PHP中获得不同的结果

时间:2011-05-15 04:54:49

标签: c# php vb.net bit-manipulation bitwise-operators

当我在PHP中运行此命令时,我得到:

Code: 2269495617392648 >> 24
Result: 32

当我在C#.net或vb.net中运行时,我得到:

Code: 2269495617392648 >> 24
Result: 135272480

PHP是正确的。

有趣的是,当我尝试在.net中移动任何大于int32的数字时,会产生不良结果..

int32 (2147483647)下的每个数字都会产生与php和c#.net或vb.net相同的结果

.net中有解决方法吗?

2 个答案:

答案 0 :(得分:12)

严格来说,PHP是错误的。

数字2269495617392648的整个位模式为:

1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648)

这24次右转让你:

0000 0000 0000 0000 0000 0000 1000 0001 0000 0001 1000 0010 0000 (135272480)

这是135272480的位模式,而不是32

PHP中发生的事情显然是通过仅保存低32位将数字2269495617392648截断为538447880。请注意,数字2269495617392648太大而不适合32位整数,有符号或无符号。

将截断位右移24次会给我们32

Before truncation to 32-bits:
1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648)

After truncation to 32-bits:
0010 0000 0001 1000 0001 0000 0000 1000 (538447880)

Right shifting the truncated bits by 24 bits:
0000 0000 0000 0000 0000 0000 0010 0000 (32)

当你说:

时,你提到了这个问题
  

有趣的是,当我   试着改变任何数字   在.net中的int32会产生错误的结果..

它会给你带来不好的结果,因为有些位被截断以便适合32位。

如果您要从PHP移植到C#并需要保留此行为,则需要使用2269495617392648 & 0xffffffff而不是2269495617392648手动截断位(请参阅jcomeau_ictx's answer)。但请注意,PHP代码中存在位截断的问题。我不确定这是否是故意的。

答案 1 :(得分:3)

在移位之前用0xffffffff按位和和你的号码。

Python中的


>>> 2269495617392648 >> 24
135272480L
>>> (2269495617392648 & 0xffffffff) >> 24
32L

我很少使用.net,但相当确定语法非常相似。