Java PHP右移
我正在尝试用php实现DataOutputStream (来自java语言的DataOutputStream) 在java代码中,它们向右移动变量,如下图所示>>> 在php中,我只能这样移动>> 如何在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为负,
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你能提供一个例子吗?