2010-12-06 6 views
3

J'ai trouvé une solution Efficient way of doing 64 bit rotate using 32 bit values mais ce n'est pas en PHP.Utilisation de bits sur des entiers 64 bits dans des systèmes 32 bits (pas d'extension php_gpm)

Le plus gros problème est que je reçois du serveur distant grand entier 9223372036854775808(10) comme hexadecimal 8000000000000000(16).

Il n'y a aucune chance d'activer php_gmp (extension) sur le serveur de production, mais je dois vérifier les bits sélectionnés dans la valeur reçue. Les deux, serveur de production et de développement sont 32bits machines.

+0

Le problème ici est que PHP que seulement a 32- types de nombres de bits intégrés sur une machine 32 bits ... un entier, un flottant. – Powerlord

Répondre

1

Vous pouvez y parvenir en utilisant BC Math (Mathématiques arbitraires de précision):

BC Math vous permet d'effectuer des opérations sur les nombres mathématiques. La différence entre l'utilisation d'opérateurs arithmétiques et l'utilisation de BC Maths est qu'au lieu de stocker le nombre sous la forme d'un entier ou d'un flottant, BC Math renvoie le nombre sous forme de chaîne.

http://php.net/manual/en/ref.bc.php

PHP doit être compilé avec BC Math; Cependant, la plupart des installations PHP devraient avoir ceci.

Malheureusement, vous ne pouvez pas effectuer d'opérations au niveau du bit sur les chaînes, et BC Math n'a pas de fonctions au niveau du bit intégrées. Toutefois; après avoir fait un peu de recherche sur Google, j'ai trouvé l'exemple de code suivant et je l'ai copié et collé ici-bas:

function bitValue($no) { return bcpow(2, $no); } 
function bitSet($no, $value) { 
    $tmp = bcmod($value, bitValue($no+1)); 
    return bccomp(bcsub($tmp, bitValue($no)), 0)>= 0; 
} 

echo bitSet(49, bitValue(48)) ."\n"; 
echo bitSet(48, bitValue(48)) ."\n"; 
echo bitSet(47, bitValue(48)) ."\n"; 

(Crédits à hernst42)

+0

J'ai également trouvé ceci - [http://www.nirvani.net/software/bc_bitwise/bc_bitwise-0.9.0.inc.php.asc](http://www.nirvani.net/software/bc_bitwise/bc_bitwise -0.9.0.inc.php.asc) qui pourrait vous aider. – bashaus

Questions connexes