homepage Welcome to WebmasterWorld Guest from 23.20.149.27
register, free tools, login, search, subscribe, help, library, announcements, recent posts, open posts,
Subscribe to WebmasterWorld

Visit PubCon.com
Home / Forums Index / Code, Content, and Presentation / PHP Server Side Scripting
Forum Library, Charter, Moderators: coopster & jatar k

PHP Server Side Scripting Forum

    
bitwise left shift differing results
32-bit vs 64-bit
Nuttzy99




msg:1274713
 10:03 am on Jun 28, 2006 (gmt 0)

My dev environment is WinXP (32 bit) running PHP 4.3.10. Running this simple compand....

echo (192<<24) ;

...yields a value of -1073741824 which is what I want since that's what most browsers running javascript will yield.

My production/staging environment is a 64-bit AMD Opteron on FreeBSD running PHP 5.0.4. For the same command it yields a value of 3221225472.

I'm guessing it has to do with the 64-bit system. Can anyone tell me how to get my server to match 32-bit systems for this result? I really don't know much about bitwise left shift, but I'm trying to get TEA encryption going.

Thanks,
-Nuttzy

 

Nuttzy99




msg:1274714
 12:31 pm on Jun 28, 2006 (gmt 0)

While writing my post I think I figured it out...

define('BIT32_MAX_SIGNED', 2147483648) ; // this is 2 to 31st power (need one bit for sign)

//$val = 3221225472 ;
$val = (192<<24) ;
echo $val . "<br/>" ;
if ($val > BIT32_MAX_SIGNED)
{
$val = BIT32_MAX_SIGNED - $val ;
}
echo $val . "<br/>" ;

...basically a 32-bit system won't exceed BIT32_MAX_SIGNED, so if we do, then we know it's a 64-bit system and need to adjust. I'll probably need to do the same thing in my javascript encrypt function in case there are any 64-bit browsers out there.

I'm still having problem with my TEA encryption in one case, so I might not have it entirely solved yet.

-Nuttzy

Nuttzy99




msg:1274715
 1:25 pm on Jun 28, 2006 (gmt 0)

Blah, when val is....

$val = (192<<24) ;

...it doesn't normalize to the same results as my 32-bit system. I have no idea why. If someone better versed in this stuff has the answer, I'll be happy to learn it.

However, for my needs, I think if I just set my javascript to use unsigned shift (<<<) then I won't have a problem on my 64-bit production system. My 32-bit system is just for development and I can work around it.

Cookie for anyone that solves this ;-)
-Nuttzy

Nuttzy99




msg:1274716
 2:24 pm on Jun 28, 2006 (gmt 0)

Sorry for all the replies. I made a bad typo in my previous message. It should read...

Blah, when val is....

$val = (152<<24)

...makes a BIG difference ;-)

-Nuttzy

rizal_a




msg:3154938
 9:32 am on Nov 13, 2006 (gmt 0)


System: The following 2 messages were spliced on to this thread from: http://www.webmasterworld.com/php/3154936.htm [webmasterworld.com] by coopster - 9:30 am on Nov. 14, 2006 (utc -6)


This is regarding Nuttzy99's posts on June 28 2006. The following function will do a 32-bit left shift:


function _32bitleftshift($number, $steps)
{
$result = 0;
if (strlen(decbin($number)) + $steps <= 31)
{
$result = $number << $steps;
}
else
{
// shift left
$binary = decbin($number).str_repeat("0", $steps);
// get the last 32 digits
$binary = substr($binary, strlen($binary) - 32);
// is the leftmost digit 1, i.e., is it a negative number?
if ($binary{0} == "1")
{
// get the last 31 digits
$binary = substr($binary, strlen($binary) - 31);
// get the 1's complement
$binary_1s_complement = "";
for ($i = 0; $i <= 30; $i++)
{
$binary_1s_complement .= ($binary{$i} == "0"? "1" : "0");
}
// get the 2's complement
$binary_2s_complement = decbin(bindec($binary_1s_complement) + 1);
$result = -1 * bindec($binary_2s_complement);
}
else
{
$result = bindec($binary);
}
}
return $result;
}

rizal_a




msg:3155703
 11:55 pm on Nov 13, 2006 (gmt 0)

Whoops ... there's actually a much faster way to find out the 2's complement of any number, which is
-(pow(2, n) - N) where n is the number of bits and N is the number for which to find out its 2's complement.

Therefore:


function leftshift32($number, $steps)
{
$binary = decbin($number).str_repeat("0", $steps);
$binary = str_pad($binary, 32, "0", STR_PAD_LEFT);
$binary = substr($binary, strlen($binary) - 32);
if ($binary{0} == "1")
{
return -(pow(2, 31) - bindec(substr($binary, 1)));
}
else
{
return bindec($binary);
}
}

Global Options:
 top home search open messages active posts  
 

Home / Forums Index / Code, Content, and Presentation / PHP Server Side Scripting
rss feed

All trademarks and copyrights held by respective owners. Member comments are owned by the poster.
Terms of Service ¦ Privacy Policy ¦ Report Problem ¦ About
© Webmaster World 1996-2014 all rights reserved