Javascript représente Number
sous forme de nombres flottants 64 bits Double Precision .
Math.floor
fonctionne dans cet esprit.
Les opérations au niveau du bit fonctionnent en 32 bits signé entiers . Les entiers signés 32 bits utilisent le premier bit comme signifiant négatif et les 31 autres bits sont le nombre. Pour cette raison, le nombre minimal et maximal autorisé des nombres signés 32 bits sont respectivement -2 147 483 648 et 2147483647 (0x7FFFFFFFF).
Donc, lorsque vous faites | 0
, vous faites essentiellement& 0xFFFFFFFF
. Cela signifie que tout nombre représenté par 0x80000000 (2147483648) ou supérieur sera renvoyé sous la forme d'un nombre négatif.
Par exemple:
// Safe
(2147483647.5918 & 0xFFFFFFFF) === 2147483647
(2147483647 & 0xFFFFFFFF) === 2147483647
(200.59082098 & 0xFFFFFFFF) === 200
(0X7FFFFFFF & 0xFFFFFFFF) === 0X7FFFFFFF
// Unsafe
(2147483648 & 0xFFFFFFFF) === -2147483648
(-2147483649 & 0xFFFFFFFF) === 2147483647
(0x80000000 & 0xFFFFFFFF) === -2147483648
(3000000000.5 & 0xFFFFFFFF) === -1294967296
Aussi. Les opérations au niveau du bit ne "plancher" pas. Ils tronquent , ce qui revient à dire qu'ils arrondissent le plus près 0
. Une fois que vous êtes passé aux nombres négatifs, Math.floor
arrondit vers le bas tandis que le bit commence à arrondir vers le haut .
Comme je l'ai déjà dit, il Math.floor
est plus sûr car il fonctionne avec des nombres flottants 64 bits. Le bit est plus rapide , oui, mais limité à une portée signée 32 bits.
Résumer:
- Bitwise fonctionne de la même manière si vous travaillez à partir de
0 to 2147483647
.
- Au niveau du bit, 1 chiffre est désactivé si vous travaillez à partir de
-2147483647 to 0
.
- Bitwise est complètement différent pour les nombres inférieurs
-2147483648
et supérieurs à 2147483647
.
Si vous voulez vraiment améliorer les performances et utiliser les deux:
function floor(n) {
if (n >= 0 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
if (n > -0x80000000 && n < 0) {
return (n - 1) & 0xFFFFFFFF;
}
return Math.floor(n);
}
Juste pour ajouter des Math.trunc
travaux comme des opérations au niveau du bit. Vous pouvez donc faire ceci:
function trunc(n) {
if (n > -0x80000000 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
return Math.trunc(n);
}