[PHP] Bit operators

Pagina: 1
Acties:

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Ik ben tijdens het coden een tegen de beperking van integers aan gelopen.

Nu heb ik dus een aantal groote getallen die ik wil xor-en
Maar dat kan niet zomaar aangezien xor een interger terug geeft en dan krijg je dus een overload. (zie voorbeeld)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
$a=2147483647 ; // MAX Int
$b=100000 ;
$c=$a ^ $b;
echo ($a) , " xor ", ($b) , " = ", ($c) , "<br>";
var_dump($a);
var_dump($b);
var_dump($c);
echo "<br>";

$a=2147483648 ; // MAX Int + 1 
$b=100000 ;
$c=$a ^ $b;
echo ($a) , " xor ", ($b) , " = ", ($c) , "<br>";
var_dump($a);
var_dump($b);
var_dump($c);
die();
?>

dit geeft dus als resultaat:
code:
1
2
3
4
2147483647 xor 100000 = 2147383647
int(2147483647) int(100000) int(2147383647) 
2147483648 xor 100000 = -2147383648
float(2147483648) int(100000) int(-2147383648)

Iemand een idee hoe ik dit kan oplossen???

Programmer - an organism that turns coffee into software.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

long gebruiken?

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Maarhe PHP heeft geen longs :'(

Programmer - an organism that turns coffee into software.


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Topicstarter
Nood gedwongen heb ik maar XOR functie gemaakt die wel met grotere getallen kan omgaan.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?
function getbin($float)
{
$i=4294967296; // Maximum Value 32 bits At the moment, kan wel groter... Alleen opletten vanaf 70368744177664 gaat een float over op SCI notation en dan werkt het script niet meer!!!!!! 
if ($float > $i || $float < 0) 
    return false;

while($i>0)
 {
  if(($float-$i)>=0)
   {
    $float-=$i;
    $bits[]=true;
   }
  else
   $bits[]=false;
  if($i==1) break;
  $i/=2;
 }
return $bits;
}

function getdec($array)
{
$size=pow(2,(count($array)-1));
$i=0;
while($size>0)
 {
  if ($array[$i])
      $total+=$size;
  $size/=2;
  $i++;        
  if($size==1) break;
 }
 return $total; 
}

function l_xor($bitsa, $bitsb)
{
if ($bitsa < 2147483648 &amp;&amp; $bitsb < 2147483648)
    return $bitsa ^ $bitsb;
else
{
$bitsa=getbin($bitsa);
$bitsb=getbin($bitsb);
foreach($bitsa as $key => $value)
     $total[$key]=$bitsb[$key] ^ $value;
return getdec($total); 
}
}

$a=2147483647 ;
$b=100000 ;
$c=l_xor($a,$b);
echo ($a) , " xor ", ($b) , " = ", ($c) , "<br>";
var_dump($a);
var_dump($b);
var_dump($c);
echo "<br>";
$a=2147483648 ;
$b=100000 ;
$c=l_xor($a,  $b);
echo ($a) , " xor ", ($b) , " = ", ($c) , "<br>";
var_dump($a);
var_dump($b);
var_dump($c);
die();
?>

Dit geeft als resultaat
code:
1
2
3
4
2147483647 xor 100000 = 2147383647
int(2147483647) int(100000) int(2147383647) 
2147483648 xor 100000 = 2147583648
float(2147483648) int(100000) float(2147583648)

Iemand nog voorstellen om de code te optimaliseren?

Programmer - an organism that turns coffee into software.