11
votes

Comment X | 0 étage le numéro en JavaScript?

dans la réponse acceptée sur ma question précédente ( Quel est le moyen le plus rapide de générer Un entier aléatoire dans JavaScript? ), je me demandais comment un numéro perd ses décimales via le symbole | .

Par exemple: xxx

Comment ce plancher est-il le numéro à 5

Quelques exemples: < / p> xxx


3 commentaires

Vous devez savoir que l'utilisation des opérateurs BitWise vous limitera aux entiers signés de 32 bits. ((math.pow (2,32) / 2) -1) | 0; // 2147483647 Supprimer le -1 et vous n'obtiendrez pas le résultat souhaité. ((math.pow (2,32) / 2)) | 0; // -2147483648


Intéressant. C'est probablement la raison pour laquelle cette fonction est légèrement plus rapide que la fonction math.floor (x) . JSPERF.com/FLOOR-OR-OR


ce n'est pas réellement "revêtement", essayez avec -1.23 pour voir ce qui se passe


3 Réponses :


5
votes

Les opérateurs bitwises convertissent leurs arguments en entiers (voir http://es5.github.com/#x9 .5 ). La plupart des langues Je sais em> ne prenez pas la prise de ce type de conversion:

    $ python -c "1.0|0"
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: unsupported operand type(s) for |: 'float' and 'int'

    $ ruby -e '1.0|0'
    -e:1:in `': undefined method `|' for 1.0:Float (NoMethodError)

    $ echo "int main(){1.0|0;}" | gcc -xc -
    : In function ‘main’:
    :1: error: invalid operands to binary | (have ‘double’ and ‘int’)


1 commentaires

s / la plupart (. *?) NE PAS / FORTMENT TAPED \ 1 Généralement pas / (Ceci est toutefois dépendant de la langue.)



15
votes

Étant donné que, selon les spécifications de la carte ECMAScript, les opérateurs d'opérateurs bitwises appellent toint32 sur chaque expression à évaluer.

voir 11.10 opérateurs binaires bitwise :

La production A: A @b , où @ est l'un des opérateurs bits dans Les productions ci-dessus sont évaluées comme suit:

  1. évaluer a .

  2. appel getvalue (résultat (1)) .

  3. évaluer b .

  4. appel getvalue (résultat (3)) .

  5. appel toint32 (résultat (2)).

  6. appel toint32 (résultat (4)).

  7. Appliquez l'opérateur bitwise @ à résultat (5) et résultat (6) . Le résultat est un entier 32 bits signé .

  8. retour résultat (7) .


0 commentaires

2
votes

Lorsque vous effectuez un étage , bien qu'il soit possible de convertir l'argument en entiers, ce n'est pas ce que la plupart des langues feraient parce que le type d'origine est un numéro de point flottant.

Un meilleur moyen de le faire tout en préservant le type de données consiste à accéder à exponent chiffres dans le mantisa et zéro les bits restants.

Si vous êtes intéressé, vous pouvez jeter un coup d'œil au Spécification IEEE pour flotter Numéros de points.


0 commentaires