Javascript steht Numberfür 64-Bit-Floating-Zahlen mit doppelter Genauigkeit .
Math.floor arbeitet in diesem Sinne.
Bitweise Operationen funktionieren in vorzeichenbehafteten 32-Bit- Ganzzahlen. Ganzzahlen mit 32-Bit-Vorzeichen verwenden das erste Bit als negativen Bezeichner und die anderen 31 Bits sind die Zahl. Aus diesem Grund sind die zulässigen 32-Bit-Nummern mit minimaler und maximaler Signatur -2.147.483.648 bzw. 2147483647 (0x7FFFFFFFF).
Wenn Sie es also tun | 0, tun Sie es im Wesentlichen & 0xFFFFFFFF. Dies bedeutet, dass jede Zahl, die als 0x80000000 (2147483648) oder höher dargestellt wird, als negative Zahl zurückgegeben wird.
Beispielsweise:
// 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
Ebenfalls. Bitweise Operationen "boden" nicht. Sie kürzen , was das gleiche ist wie zu sagen, sie runden am nächsten 0. Sobald Sie gehen um zu negativen Zahlen Math.floorRunde nach unten , während bitweise Start Rundung nach oben .
Wie ich bereits sagte, Math.floorist sicherer, weil es mit schwebenden 64-Bit-Zahlen arbeitet. Bitweise ist zwar schneller , aber auf den mit 32 Bit signierten Bereich beschränkt.
Zusammenfassen:
- Bitweise funktioniert genauso, wenn Sie von arbeiten
0 to 2147483647 .
- Bitweise ist 1 Zahl aus, wenn Sie von arbeiten
-2147483647 to 0 .
- Bitweise ist für Zahlen kleiner
-2147483648und größer als völlig anders 2147483647.
Wenn Sie die Leistung wirklich optimieren und beides verwenden möchten:
function floor(n) {
if (n >= 0 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
if (n > -0x80000000 && n < 0) {
return (n - 1) & 0xFFFFFFFF;
}
return Math.floor(n);
}
Das Hinzufügen Math.truncfunktioniert wie bitweise Operationen. So können Sie Folgendes tun:
function trunc(n) {
if (n > -0x80000000 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
return Math.trunc(n);
}