Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 不同机器上的不同位运算结果_Php_Bit Manipulation_Bitwise Operators_Bit Shift - Fatal编程技术网

Php 不同机器上的不同位运算结果

Php 不同机器上的不同位运算结果,php,bit-manipulation,bitwise-operators,bit-shift,Php,Bit Manipulation,Bitwise Operators,Bit Shift,我正在使用以下代码在PHP中实现一个简单的位旋转: ($n>>1)和0xFFFFFFFF)|($n&0x00000001)这个问题肯定是由PHP_INT_大小为4而不是8引起的。在x86-64 windows上,PHP 5.5和5.6是实验性的,并且使用32位算法。没有任何方法可以解决这个问题,所以您只需考虑到,即使在相同的体系结构中,单词大小也可能从4字节到8字节不等。您可以在这里逐步检查。我做了一点 我演示了两个位旋转:第一个用于2147483647,第二个用于2147483648 第一个是

我正在使用以下代码在PHP中实现一个简单的位旋转:


($n>>1)和0xFFFFFFFF)|($n&0x00000001)这个问题肯定是由PHP_INT_大小为4而不是8引起的。在x86-64 windows上,PHP 5.5和5.6是实验性的,并且使用32位算法。没有任何方法可以解决这个问题,所以您只需考虑到,即使在相同的体系结构中,单词大小也可能从4字节到8字节不等。

您可以在这里逐步检查。我做了一点

我演示了两个位旋转:第一个用于2147483647,第二个用于2147483648 第一个是最大32位数字,第二个是多一个

见:

您可以看到,从4.3.0以上的每个PHP版本的输出都是相同的

代码如下:

<?php

$n = 2147483647;
shift($n);
echo "\n";
echo "\n";
echo "\n";
echo "\n";
$n = 2147483648;
shift($n);

function out($a, $b, $c, $b2 = '0', $c1 = ' ') {
    $padstra = 40;
    $padstrb = 23;
    echo 
        str_pad($a, $padstra, ' ', STR_PAD_LEFT) 
      . " " 
      . str_pad(decbin($b), 32, $b2, STR_PAD_LEFT) 
      . " " 
      . str_pad($c, $padstrb, $c1) . "\n";
}

function shift($n) {
    out($n    , $n , '$n'   );
    echo "\n";
    out('A:', $n >> 1 , '$n >> 1'   );
    out('B:', 0xFFFFFFFF , '0xFFFFFFFF'   );
    out('A & B:', ($n >> 1) & 0xFFFFFFFF , '($n >> 1) & 0xFFFFFFFF'   );
    echo "\n";
    out('C:', $n , '$n'   );
    out('D:', 0x00000001 , '0x00000001'   );
    out('C & D:', $n & 0x00000001 , '$n & 0x00000001'   );
    echo "\n";
    out('C & D:', $n & 0x00000001 , '$n & 0x00000001'   );
    out('(C & D) << 31:', ($n & 0x00000001) << 31 , '($n & 0x00000001) << 31'   );
    echo "\n";
    out('A & B:', ($n >> 1) & 0xFFFFFFFF , '($n >> 1) & 0xFFFFFFFF'   );
    out('(C & D) << 31:', ($n & 0x00000001) << 31 , '($n & 0x00000001) << 31'   );
    out('(A & B) | ((C & D) << 31):', ($n >> 1) & 0xFFFFFFFF | ($n & 0x00000001) << 31 , '($n >> 1) & 0xFFFFFFFF | ($n & 0x00000001) << 31');
}

您能否显示示例输出以及所使用的PHP版本,或者OS^添加到其中:示例输入也会很有帮助(对于
$n
)。不同版本的输出似乎相同:值得注意的是,windows上的x86-64 PHP 5.5和5.6使用32位算术。@Prodigle,但它们都是x86@Prodigle这似乎是问题所在。有什么办法可以解决吗?
                      2147483647 01111111111111111111111111111111 $n                     

                              A: 00111111111111111111111111111111 $n >> 1                
                              B: 11111111111111111111111111111111 0xFFFFFFFF             
                          A & B: 00111111111111111111111111111111 ($n >> 1) & 0xFFFFFFFF 

                              C: 01111111111111111111111111111111 $n                     
                              D: 00000000000000000000000000000001 0x00000001             
                          C & D: 00000000000000000000000000000001 $n & 0x00000001        

                          C & D: 00000000000000000000000000000001 $n & 0x00000001        
                  (C & D) << 31: 10000000000000000000000000000000 ($n & 0x00000001) << 31

                          A & B: 00111111111111111111111111111111 ($n >> 1) & 0xFFFFFFFF 
                  (C & D) << 31: 10000000000000000000000000000000 ($n & 0x00000001) << 31
      (A & B) | ((C & D) << 31): 10111111111111111111111111111111 ($n >> 1) & 0xFFFFFFFF | ($n & 0x00000001) << 31




                      2147483648 10000000000000000000000000000000 $n                     

                              A: 01000000000000000000000000000000 $n >> 1                
                              B: 11111111111111111111111111111111 0xFFFFFFFF             
                          A & B: 01000000000000000000000000000000 ($n >> 1) & 0xFFFFFFFF 

                              C: 10000000000000000000000000000000 $n                     
                              D: 00000000000000000000000000000001 0x00000001             
                          C & D: 00000000000000000000000000000000 $n & 0x00000001        

                          C & D: 00000000000000000000000000000000 $n & 0x00000001        
                  (C & D) << 31: 00000000000000000000000000000000 ($n & 0x00000001) << 31

                          A & B: 01000000000000000000000000000000 ($n >> 1) & 0xFFFFFFFF 
                  (C & D) << 31: 00000000000000000000000000000000 ($n & 0x00000001) << 31
      (A & B) | ((C & D) << 31): 01000000000000000000000000000000 ($n >> 1) & 0xFFFFFFFF | ($n & 0x00000001) << 31