จาวาสคริหมายถึงNumber
เป็นคู่แม่นยำตัวเลขลอย 64 บิต
Math.floor
ทำงานร่วมกับสิ่งนี้ในใจ
การทำงานของ Bitwise ทำงานในจำนวนเต็ม32 บิตที่ลงนามแล้ว เลขจำนวนเต็ม 32 บิตที่ใช้บิตแรกเป็นตัวบ่งชี้เชิงลบและอีกบิตที่ 31 คือจำนวน ด้วยเหตุนี้จำนวนนาทีและสูงสุดที่อนุญาตให้ใช้หมายเลขที่เซ็นชื่อแบบ 32 บิตคือ -2,147,483,648 และ 2147483647 (0x7FFFFFFFF) ตามลำดับ
ดังนั้นเมื่อคุณกำลังทำคุณกำลังทำหลักคือ| 0
& 0xFFFFFFFF
ซึ่งหมายความว่าตัวเลขใด ๆ ที่แสดงเป็น 0x80000000 (2147483648) หรือมากกว่านั้นจะส่งคืนเป็นจำนวนลบ
ตัวอย่างเช่น:
// 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
ด้วย การใช้งานระดับบิตไม่ใช่ "ชั้น" พวกเขาตัด0
ซึ่งเป็นเช่นเดียวกับว่าพวกเขารอบที่อยู่ใกล้ เมื่อคุณไปรอบ ๆ ไปยังหมายเลขลบMath.floor
รอบลงในขณะที่เริ่มต้นบิตปัดเศษขึ้น
อย่างที่ฉันพูดไปก่อนหน้าMath.floor
นี้ปลอดภัยกว่าเพราะทำงานกับตัวเลขลอยตัว 64 บิต Bitwise เร็วกว่าใช่ แต่ จำกัด ขอบเขตการลงชื่อ 32 บิต
เพื่อสรุป:
- Bitwise
0 to 2147483647
ทำงานเดียวกันถ้าคุณทำงานจากที่
- ค่าที่เหมาะสมคือ 1
-2147483647 to 0
เลขที่ออกถ้าคุณทำงานจากที่
- Bitwise แตกต่างอย่างสิ้นเชิงสำหรับตัวเลขที่น้อยกว่าและมากกว่า
-2147483648
2147483647
หากคุณจริงๆต้องการปรับแต่งประสิทธิภาพการทำงานและการใช้งานทั้ง:
function floor(n) {
if (n >= 0 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
if (n > -0x80000000 && n < 0) {
return (n - 1) & 0xFFFFFFFF;
}
return Math.floor(n);
}
เพียงเพิ่มMath.trunc
งานเช่นการดำเนินการระดับบิต ดังนั้นคุณสามารถทำสิ่งนี้:
function trunc(n) {
if (n > -0x80000000 && n < 0x80000000) {
return n & 0xFFFFFFFF;
}
return Math.trunc(n);
}