Re: Strange Right-Shift Problem

From: Date: Fri, 30 Dec 2005 20:54:39 +0000
Subject: Re: Strange Right-Shift Problem
References: 1 2  Groups: php.general 
Request: Send a blank email to php-general+get-228048@lists.php.net to get a copy of this message
Hello Thanks for your answers. I now implemented everything new, with the mcrypt-extension. However, I use the crypt_xtea still for a compatibility mode. I had to implement the right-shift and other bit operations. If someone is interested: The problem occurred always when a number exceeded the 32bit and is negative. The old behavior was to take 32bits and ignore the other bits (therefore the sign could change in the rshift-operation). The following simulates the old behavior: function getbits($i) {
      $bits = array();
      while (abs($i) > 1) {
          $f1 = floor($i / 2.0);
          $f2 = ceil($i / 2.0);
          if ($f1!=$f2) {
              array_push($bits, 1);
          } else {
              array_push($bits, 0);
          }
          $i = $f1;
      }
      return $bits;
} function convertto32($i) {
      $bits = getbits($i);
      $i = 0;
      if ($bits[ 0]) $i|=0x00000001;
      if ($bits[ 1]) $i|=0x00000002;
      ....
      if ($bits[31]) $i|=0x80000000;
      return $i;
} function rshift($i, $n) {
      if ($i < -2147483648) {
          $i = convertto32($i);
      }
      return $i >> $n;
} thx Michael Gross Richard Lynch wrote:
On Thu, December 29, 2005 5:37 pm, Michael Gross wrote:
Hello I have to migrate a PHP-application to a new Linux-Box. Both the old and the new system are Linux and PHP 5.1.1. (the old one has a Pentium 4, the new one two Xeon CPUs). I have a problem using the Crypt_Xtea-Extension. I narrowed it down to the following right-shift operation: (-3281063054 >> 11) produces different results: Old System: 495070 New System: -1048576 I understand that both results are "wrong", but everything worked with the old behavior and I need that behavior back very urgent. Maybe someone can explain me in which way the bits are shifted so that the result is 495070? If I understand it, I implement my "own" shift function.
Assuming the previous hypothesis that it's 32-bit versus 64-bit machines at work... If you can determine the number of bits on your system, you could use a different number from 11 on the two systems to get the answer you want. if (is_32_bit_machine()){ $y = $x >> 11; } else{ $y = $x >> 43; //11 + 32 (guess) } One hack for detecting 32-bit machine might be this: function is_32_bit_machine(){ return mt_getrandmax() == 0xffffffff; } I suppose if you're going to do this right, what you REALLY should do is code it to determine the number of bits, no matter how large, and then bit-shift the correct amount based on that. So when the 128-bit machines come out in a few years, you aren't re-coding this same damn problem AGAIN.


« previous php.general (#228048) next »