जावास्क्रिप्ट डबल प्रिसिजन 64-बिट फ्लोटिंग नंबरों केNumber
रूप में प्रतिनिधित्व करता है ।
Math.floor
इसे ध्यान में रखकर काम करता है।
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 बिट फ्लोटिंग नंबरों के साथ काम करता है। बिटवाइज़ तेज़ है , हाँ, लेकिन 32 बिट पर हस्ताक्षर किए गए दायरे तक सीमित है।
संक्षेप में:
- यदि आप काम करते हैं तो बिटवाइज वही काम करता है
0 to 2147483647
।
- यदि आप काम करते हैं तो बिटवाइज़ 1 नंबर बंद है
-2147483647 to 0
।
- बिटवाइज संख्या से कम
-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);
}