Javascript steht Number
fü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.floor
Runde nach unten , während bitweise Start Rundung nach oben .
Wie ich bereits sagte, Math.floor
ist 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
-2147483648
und 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.trunc
funktioniert wie bitweise Operationen. So können Sie Folgendes tun:
function trunc(n) {
if (n > -0x80000000 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
return Math.trunc(n);
}