Java PHP右移

Java PHP右移,java,php,bit-manipulation,Java,Php,Bit Manipulation,我正在尝试用php实现DataOutputStream (来自java语言的DataOutputStream) 在java代码中,它们向右移动变量,如下图所示>>> 在php中,我只能这样移动>> 如何在php中实现这一点 谢谢你你可以这样说: n>>s的值是n右移的s位位置,扩展为零。如果n为正,则结果与n>>s的结果相同;如果n为负值,则结果等于表达式(n>>s)+(2s)+(2L的结果。您可以这样: n>>s的值是n右移的s位,扩展为零。如果n为正,则结果与n>>s的结果相同;如果n为负,

我正在尝试用php实现DataOutputStream (来自java语言的DataOutputStream) 在java代码中,它们向右移动变量,如下图所示>>>

在php中,我只能这样移动>>

如何在php中实现这一点

谢谢你

你可以这样说:

n>>s
的值是
n
右移的
s
位位置,扩展为零。如果
n
为正,则结果与
n>>s
的结果相同;如果
n
为负值,则结果等于表达式
(n>>s)+(2s)+(2L的结果。您可以这样:


n>>s
的值是
n
右移的
s
位,扩展为零。如果
n
为正,则结果与
n>>s
的结果相同;如果
n
为负,则结果等于任何平台的掩蔽形式的表达式
(n>>s)+(2s)+(2L(32位、64位……未来,只要定义了
PHP\u INT\u MAX
),这可能会带来性能优势(无分支):

掩码设置为
$uint
最左边的
$shift
位设置所有零。注意:如果您希望能够/允许零移位负数/大数,请取消对第一行的注释(因为掩码将修改负数/大数,即使
$shift=0

显示其在32位中工作的单元测试代码:

class UintRShiftTest extends PHPUnit_Framework_TestCase {
   public function provide_shifts() {
      return array(
         /*   start         shift       end*/
          array(0,          4,          0)
         ,array(0xf,        4,          0)
         ,array(0xff,       4,          0xf)
         ,array(0xfffffff,  4,          0xffffff)
         ,array(0xffffffff, 4,          0xfffffff)
         ,array(-1,         4,          0xfffffff)//Same as above
         ,array(0,          1,          0)
         ,array(0xf,        1,          0x7)
         ,array(-1,         1,          0x7fffffff)
         );
   }

   /**
    * @dataProvider provide_shifts
    */
   function test_uintRShift($start,$shift,$end) {
      $this->assertEquals($end,uintRShift($start,$shift));
   }
}
为了实现上述功能的价值:

function uintRShift_branch($uint,$shift)
{
   if ($uint<0) {
      return ($uint>>$shift)+(2<<~$shift);
   } else {
      return $uint>>$shift;
   }
}
函数uintRShift\u分支($uint,$shift)
{
如果($uint>$shift)+(2$shift;
}
}
自动测试失败:

  • #4报告
    -1
    。这可能可以通过PHP报告
    0xffffffff
    作为一个大正数来证明(文档表明大整数自动切换为浮点,尽管位移位似乎仍然将其视为一个常规整数)

  • #8结果为
    -2147483649
    ,这实际上是正确的(与
    0x7fffffff
    相同),但低于PHP的最小int值:
    -2147483648


以屏蔽形式,适用于任何平台(32位、64位……只要定义了
PHP\u INT\u MAX
),可能会提供性能优势(无分支):

掩码设置为
$uint
最左边的
$shift
位设置所有零。注意:如果您希望能够/允许零移位负数/大数,请取消对第一行的注释(因为掩码将修改负数/大数,即使
$shift=0

显示其在32位中工作的单元测试代码:

class UintRShiftTest extends PHPUnit_Framework_TestCase {
   public function provide_shifts() {
      return array(
         /*   start         shift       end*/
          array(0,          4,          0)
         ,array(0xf,        4,          0)
         ,array(0xff,       4,          0xf)
         ,array(0xfffffff,  4,          0xffffff)
         ,array(0xffffffff, 4,          0xfffffff)
         ,array(-1,         4,          0xfffffff)//Same as above
         ,array(0,          1,          0)
         ,array(0xf,        1,          0x7)
         ,array(-1,         1,          0x7fffffff)
         );
   }

   /**
    * @dataProvider provide_shifts
    */
   function test_uintRShift($start,$shift,$end) {
      $this->assertEquals($end,uintRShift($start,$shift));
   }
}
为了实现上述功能的价值:

function uintRShift_branch($uint,$shift)
{
   if ($uint<0) {
      return ($uint>>$shift)+(2<<~$shift);
   } else {
      return $uint>>$shift;
   }
}
函数uintRShift\u分支($uint,$shift)
{
如果($uint>$shift)+(2$shift;
}
}
自动测试失败:

  • #4报告
    -1
    。这可能可以通过PHP报告
    0xffffffff
    作为一个大正数来证明(文档表明大整数自动切换为浮点,尽管位移位似乎仍然将其视为一个常规整数)

  • #8结果为
    -2147483649
    ,这实际上是正确的(与
    0x7fffffff
    相同),但低于PHP的最小int值:
    -2147483648


  • 这就是我必须做的私有函数shiftRight3($a,$b){if(is_numeric($a)&&&$a<0){return$a>>$b+(2$b;}}}}}不,不完全是。你需要做的就是移位和掩码到所需的位数。嘿,EJP能提供一个例子吗?这就是我必须做的私有函数shiftRight3($a,$b){if(is_numeric($a)&$a<0){return$a>>$b+(2$b;}}}}不,不完全是。你需要做的只是移位和掩码到所需的位数。嘿,EJP你能提供一个例子吗?