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: p> mais malheureusement, cela ne fonctionne pas Parfaitement. P> par exemple: -1149025787 >>> 0
JavaScript retourne 3145941509
PHP ZerOfill () Retour 0 P> P>
8 Réponses :
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: p>
Votre fonction ne fonctionne pas car lorsque sera évaluée, qui retourne 0. P> < P> En supposant des machines 32 bits, vous pouvez ajouter un cas spécial: p> $ b == 0 code>, l'expression
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);
Cela fonctionne pour moi
Dans certains cas, cela ne fonctionne pas
deux fois plus vite pour les nombres négatifs que l'utilisation des conversions décimales binaires
pour les deux entiers 32 bits (php_int_size == 4) et 64 bits (php_int_size == 8):
Ne fonctionne pas avec SHR (-1149025787,0) code>, attendu 3145941509, got -1149025787
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; }
@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
/** * 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.
Niveau suivant Stuff 😳👍
La fonction RRR ne fonctionne pas dans certains cas comme prévu.
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?