Javascript Number
, Double Precision 64-bit Kayan sayılar olarak temsil edilir .
Math.floor
bunu akılda tutarak çalışır.
Bitsel işlemler 32 bit işaretli tamsayılarda çalışır. 32 bit imzalı tamsayılar ilk biti negatif belirteç olarak kullanır ve diğer 31 bit ise sayıdır. Bu nedenle, izin verilen minimum ve maksimum 32bit işaretli sayılar sırasıyla -2.147.483.648 ve 2147483647'dir (0x7FFFFFFFF).
Yani yaptığınız zaman | 0
, esasen yapıyorsunuz & 0xFFFFFFFF
. Bu, 0x80000000 (2147483648) veya daha büyük olarak temsil edilen herhangi bir sayının negatif sayı olarak döneceği anlamına gelir.
Örneğin:
// 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
Ayrıca. Bitsel işlemler "zemin" yapmaz. Onlar kesmek onlar en yakın yuvarlamak diyerek aynı olan, 0
. Negatif sayılara döndüğünüzde, aşağıMath.floor
yuvarlar bitsel olarak yukarı yuvarlar .
Daha önce söylediğim gibi Math.floor
, daha güvenli çünkü 64bit yüzer sayılarla çalışıyor. Bitsel daha hızlıdır , evet, ancak 32bit imzalı kapsamla sınırlıdır.
Özetlemek:
- Bitwise,
0 to 2147483647
.
- Eğer çalışıyorsanız Bitwise 1 numara kapalı
-2147483647 to 0
.
- Bitwise'dan küçük
-2147483648
ve büyük sayılar için Bitwise tamamen farklıdır2147483647
.
Eğer varsa gerçekten performansı artırmak isteyen ve hem kullanın:
function floor(n) {
if (n >= 0 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
if (n > -0x80000000 && n < 0) {
return (n - 1) & 0xFFFFFFFF;
}
return Math.floor(n);
}
Sadece Math.trunc
bitsel işlemler gibi işler eklemek için . Böylece bunu yapabilirsiniz:
function trunc(n) {
if (n > -0x80000000 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
return Math.trunc(n);
}