6
votes

PHP équivalent JavaScript >>> Décalage à droite avec des opérateurs bits à remplissage zéro?

Puis-je savoir comment puis-je faire PHP >>>? Ces opérateurs ne sont pas disponibles en PHP, mais sont disponibles en JavaScript.

Je viens de réussir à découvrir une fonction suivante: xxx

mais malheureusement, cela ne fonctionne pas Parfaitement.

par exemple: -1149025787 >>> 0 JavaScript retourne 3145941509 PHP ZerOfill () Retour 0


4 commentaires

Pouvez-vous décrire ce qui ne va pas avec ça?


J'imagine que vous avez vu: PHP.net/manual/fr/Language.Pérateurs. .bitwise.php


@1149025787 >>> 0 en JavaScript retourne 3145941509 Mais à Zerofill () ci-dessus, il vient de retourner 0.


Zerofill ne fonctionne pas sur 64bits, une idée de quoi?


8 Réponses :


2
votes

J'ai étudié autour des toiles et sortez avec ma propre fonction ZerOfill, base sur l'explication donnée. Cette méthode fonctionne pour mon programme.

aperçu: xxx


0 commentaires

1
votes

Votre fonction ne fonctionne pas car lorsque $ b == 0 , l'expression xxx

sera évaluée, qui retourne 0. < P> En supposant des machines 32 bits, vous pouvez ajouter un cas spécial: xxx


0 commentaires

1
votes

Vous ne savez pas si cela fonctionne pour PHP, je parviens à le faire fonctionner avec C #.

int a, b, result;
//Instead of 
result = a >>> b;
//I do
result = (int)((uint)a >> b);


0 commentaires

0
votes

Cela fonctionne pour moi xxx


1 commentaires

Dans certains cas, cela ne fonctionne pas



5
votes

deux fois plus vite pour les nombres négatifs que l'utilisation des conversions décimales binaires xxx


0 commentaires

2
votes

pour les deux entiers 32 bits (php_int_size == 4) et 64 bits (php_int_size == 8): xxx


1 commentaires

Ne fonctionne pas avec SHR (-1149025787,0) , attendu 3145941509, got -1149025787



3
votes

J'ai beaucoup abordé à ce sujet, a collecté plus de 11 versions des projets Stackoverflow et Open-Source, aucun d'entre eux n'a travaillé. Mais enfin, j'ai trouvé la solution.

Pour plus de détails, une démonstration en direct, des tests et des exemples Vérifiez ma question et réponse:
Non signé DROIT / ZERO-REMBOUR-REMBOUR-REMPLISSE DROIT DE PHP (Equivalent Java / JavaScript) P>

function unsignedRightShift($a, $b) {
    if ($b >= 32 || $b < -32) {
        $m = (int)($b/32);
        $b = $b-($m*32);
    }

    if ($b < 0) {
        $b = 32 + $b;
    }

    if ($b == 0) {
        return (($a>>1)&0x7fffffff)*2+(($a>>$b)&1);
    }

    if ($a < 0) 
    { 
        $a = ($a >> 1); 
        $a &= 0x7fffffff; 
        $a |= 0x40000000; 
        $a = ($a >> ($b - 1)); 
    } else { 
        $a = ($a >> $b); 
    }

    return $a; 
}


2 commentaires

@king_nak merci pour la modification! Pouvez-vous s'il vous plaît partager les raisons de cela? Est-ce juste pour le rendre plus cohérent ou quelque chose de lié à la sécurité ou à la précision?


C'est juste pour la clarté et la cohérence. 2147483647 est assez obscurci pour moi, mais avec 0x7FFFFFFF, il est clair que tous les bits sauf le MSB sont définis



9
votes
/**
 * The >>> javascript operator in php x86_64
 * Usage: -1149025787 >>> 0 ---> rrr(-1149025787, 0) === 3145941509
 * @param int $v
 * @param int $n
 * @return int
 */
function rrr($v, $n)
{
    return ($v & 0xFFFFFFFF) >> ($n & 0x1F);
}

/**
 * The >> javascript operator in php x86_64
 * @param int $v
 * @param int $n
 * @return int
 */
function rr($v, $n)
{
    return ($v & 0x80000000 ? $v | 0xFFFFFFFF00000000 : $v & 0xFFFFFFFF) >> ($n & 0x1F);
}


/**
 * The << javascript operator in php x86_64
 * @param int $v
 * @param int $n
 * @return int
 */
function ll($v, $n)
{
    return ($t = ($v & 0xFFFFFFFF) << ($n & 0x1F)) & 0x80000000 ? $t | 0xFFFFFFFF00000000 : $t & 0xFFFFFFFF;
}
Enjoy it.

2 commentaires

Niveau suivant Stuff 😳👍


La fonction RRR ne fonctionne pas dans certains cas comme prévu.