【问题标题】:How can I implement a JS-style bitwise left shift operator in PHP? [duplicate]如何在 PHP 中实现 JS 风格的按位左移运算符? [复制]
【发布时间】:2019-08-17 18:56:07
【问题描述】:

我正在尝试将 PHP 中的值与 JavaScript 中的结果进行比较。我已经尝试过 stackoverflow 中的解决方案,但目前我无法让它按照我想要的方式工作。我目前正在运行 PHP 7.1。

例如在 JS 环境比如 Chrome WebTools Console 中运行这个

var testValue = 94427771; (testValue << 5)

结果: -1273278624

而在 PHP 中类似的会产生以下结果:

$testValue = 94427771; $testValue = ($testValue << 5); echo $testValue;

输出为:96694037504

我也试过这个发布在stackOverflow上的函数

function shift_left_32( $a, $b ) { return ( $c = $a << $b ) && $c >= 4294967296 ? $c - 4294967296 : $c; }

在哪里运行代码shift_left_32($testValue, 5);它返回值:3021688672

请问我该如何解决这个问题。谢谢。

【问题讨论】:

    标签: javascript php bit-manipulation bitwise-operators bit-shift


    【解决方案1】:

    如果您想将按位移位的返回值限制为 32 位有符号整数,那么您可以将数字取模为最大 32 位有符号整数,然后使其溢出。

    function shift_left_32( $a, $b ) {
        return ( $c = $a << $b ) && $c > 0x7FFFFFFF ? ($c % 0x80000000)-0x80000000 : $c;
    }
    

    或者更简单、更正确的按位或:

    function shift_left_32( $a, $b ):int {
        return ( $a << $b ) | -0x80000000;
    }
    

    更多信息你可以看看这个问题:Convert from 64bit number to 32bit number

    【讨论】:

    • 感谢您的回复,但是为该特定值工作。例如。如果你尝试在 javascript 中运行 (-1367706280
    • 你能检查我更新的答案并告诉我它是否有效吗?
    • 抱歉压力很大,使用新功能我实现了我想要的值,但现在我想要的其他一些值不起作用,例如我想调用:(shift_left_32(0, 5 )) - 0 + 99 in javascript 格式 [(0
    • 尝试使用链接中的功能:3v4l.org/YPHku 如果它有效,那么让我们作为重复关闭,所以我不会把功劳
    • 认为这行得通,现在我认为我对按位 AND 存在问题。当我在 JS -2833227500 和 -2833227500 中执行时,我得到的值是 1461739796,但在 PHP 中,同样的执行给出的值是 -2833227500。我可以从这里向您寻求帮助吗?到目前为止感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 2020-01-23
    • 2019-09-24
    相关资源
    最近更新 更多