为什么右移-1在PHP中总是给出-1?

为什么右移-1在PHP中总是给出-1?,php,shift,negative-number,Php,Shift,Negative Number,我试图弄明白为什么如果我将负整数-1移位,我总是得到-1,例如: echo -1 >> 64; // -1 echo -1 >> 5; // -1 echo -1 >> 43; // -1 echo -1 >> 1; // -1 无论右移位的第二个操作数是多少,-1仍然是-1。。。我明白,当你右转时,你实际上是在这样做: x>>y=x/2^y 但如果x为-1,如果是,我会: -1>>3=-1/2^3 这个值不应该是-1/8=-0.125吗 感谢您

我试图弄明白为什么如果我将负整数-1移位,我总是得到-1,例如:

echo -1 >> 64; // -1
echo -1 >> 5; // -1
echo -1 >> 43; // -1
echo -1 >> 1; // -1
无论右移位的第二个操作数是多少,-1仍然是-1。。。我明白,当你右转时,你实际上是在这样做:

x>>y=x/2^y

但如果x为-1,如果是,我会:

-1>>3=-1/2^3

这个值不应该是-1/8=-0.125吗


感谢您的关注。

按位移位运算符不进行除法。他们做他们应该做的事——移位位。特别是,右换档操作员执行以下操作:

  • 对于从右边开始的每一位,将其值设置为左边的值
  • 对于左边没有任何内容的最左边的位,保留其当前值
例如,如果您的号码是

1011...101
右移给你

11011...10
因此,最右边的位(LSB)丢失,最左边的位(MSB)重复。这称为“符号传播”,因为MSB用于区分正数(MSB=0)和负数(MSB=1)

负数存储为“2的补码”,即在32位系统上,
-x
存储为
2^32-x
。所以,
-1
10…00(32个零)-1
=
1…1(32个一)
。如果按照上述步骤移动32个,则再次得到32个,也就是说,
-1>>无论什么
都将始终是
-1

右移和二除的区别在于,对于奇数和偶数,右移的结果是相同的。由于最右边的位丢失,当您移动奇数(LSB=1)时,结果与移动下一个更低的偶数(相同的位组合,但LSB=0)相同。所以,当你移动时,你不会得到一半,因为红利是被强迫的。比如说,

1010=10102,10/2=5.0和10>>1==510==1012

1110=10112,11/2=5.5,但11>>1==510==1012

如果你更愿意用除法来思考
x>>1
,它首先将x“四舍五入”为偶数(
x-abs(x)%2
),然后将该数除以2


对于
x=-1
这将为您提供
(-1-abs(-1)%2)/2==(-1-1)/2=-2/2=-1
,这在我所知道的所有语言中都是一样的-1的位算术右移将是-1,正如其他人提到的,此操作只能应用于整数

-1在二进制中表示为填充值1的所有位。对于算术右移,位将右移,最高位(在左侧)将填充值的符号,对于负值,它将为1,对于正值,它将为-0。所以它在换班后再次变成-1


还有其他类型的按位移位,对于逻辑右移,最高位将用零填充。您可以在这里获得更多信息:

整数,整数,整数。引用手册(我的重点):
逐位运算符允许计算和操作“整数”中的特定位。
哦,伙计,说真的。。。5票?这一定是一场噩梦!