Skocz do zawartości

Operatory binarne


Erbit

Rekomendowane odpowiedzi

  • Odpowiedzi 38
  • Dodano
  • Ostatniej odpowiedzi
  • 1 miesiąc temu...

Wróciłem do pomysłu AdSensLab.

oto poprawiona wersja funkcji mix.

Ta nie zawiera błędów wykrytych w poprzedniej wersji. Peroszę o testy i wnioski

function mix($a,$b,$c)
{
$a=przekrec($a);$b=przekrec($b);$c=przekrec($c);
$a -= $b;$a=przekrec($a);
$a -= $c;$a=przekrec($a);
$t=(zeroFill($c,13));$t=przekrec($t);
$a ^= $t;$a=przekrec($a);
$b -= $c;$b=przekrec($b);
$b -= $a;$b=przekrec($b);
$t=($a<<8);$t=przekrec($t);
$b ^= $t;$b=przekrec($b);
$c -= $a;$c=przekrec($c);
$c -= $b;$c=przekrec($c);
$t=(zeroFill($b,13));$t=przekrec($t);
$c ^= $t;$c=przekrec($c);
$a -= $b;$a=przekrec($a);
$a -= $c;$a=przekrec($a);
$t=(zeroFill($c,12));$t=przekrec($t);
$a ^= $t;$a=przekrec($a);
$b -= $c;$b=przekrec($b);
$b -= $a;$b=przekrec($b);
$t=($a<<16);$t=przekrec($t);
$b ^= $t;$b=przekrec($b);
$c -= $a;$c=przekrec($c);
$c -= $b;$c=przekrec($c);
$t=(zeroFill($b,5));$t=przekrec($t);
$c ^= $t;$c=przekrec($c);
$a -= $b;$a=przekrec($a);
$a -= $c;$a=przekrec($a);
$t=(zeroFill($c,3));$t=przekrec($t);
$a ^= $t;$a=przekrec($a);
$b -= $c;$b=przekrec($b);
$b -= $a;$b=przekrec($b);
$t=$a<<10;$t=przekrec($t);
$b ^= $t;$b=przekrec($b);
$c -= $a;$c=przekrec($c);
$c -= $b;$c=przekrec($c);
$t=(zeroFill($b,15));$t=przekrec($t);
$c ^= $t;$c=przekrec($c);
return array($a,$b,$c);
}

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 miesiąc temu...

Podam inne rozwiązanie problemu:

function toInt32(& $x){ 
$z = hexdec(80000000); 
$y = (int)$x; 
  // on 64bit OSs if $x is double, negative ,will return -$z in $y 
  // which means 32th bit set (the sign bit) 
if($y==-$z&&$x<-$z){ 
	 $y = (int)((-1)*$x);// this is the hack, make it positive before 
	 $y = (-1)*$y; // switch back the sign 
	 //echo "int hack <br>"; 
} 
$x = $y; 
}

$a -= $b; $a -= $c; toInt32($a); $a = (int)($a ^ (zeroFill($c,13))); 

function mix($a,$b,$c) { 
 $a -= $b; $a -= $c; toInt32($a); $a = (int)($a ^ (zeroFill($c,13))); 
 $b -= $c; $b -= $a; toInt32($b); $b = (int)($b ^ ($a<<8)); 
 $c -= $a; $c -= $b; toInt32($c); $c = (int)($c ^ (zeroFill($b,13))); 
 $a -= $b; $a -= $c; toInt32($a); $a = (int)($a ^ (zeroFill($c,12))); 
 $b -= $c; $b -= $a; toInt32($b); $b = (int)($b ^ ($a<<16)); 
 $c -= $a; $c -= $b; toInt32($c); $c = (int)($c ^ (zeroFill($b,5))); 
 $a -= $b; $a -= $c; toInt32($a); $a = (int)($a ^ (zeroFill($c,3))); 
 $b -= $c; $b -= $a; toInt32($b); $b = (int)($b ^ ($a<<10)); 
 $c -= $a; $c -= $b; toInt32($c); $c = (int)($c ^ (zeroFill($b,15))); 
 return array($a,$b,$c); 
} 

Można też dopisać warunek sprawdzajacy platforme.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności