2010-01-05 15 views
16

मैं किसी अन्य भाषा में मस्तिष्क-मृत सरल कुछ करने की कोशिश कर रहा हूं लेकिन जावास्क्रिप्ट नहीं: फ्लोट (और दूसरी तरफ) से बिट्स प्राप्त करें।जावास्क्रिप्ट फ्लोट से/बिट्स तक

सी में/C++ ऐसा

 
float a = 3.1415; 
int b = *((int*)&a); 

कुछ हो सकता है और शिकंजा प्रतिकूल

 
int a = 1000; 
float b = *((float*)&a); 

सी # में आप जावा में एक जैसे उपयोग कर सकते हैं BitConverter ... floatBits या कुछ और .. यहां तक ​​कि मसीह के लिए वीबी 6 में भी आप एक फ्लोट 32 को int32 में memcpy कर सकते हैं। मैं पृथ्वी पर कैसे और int और जावास्क्रिप्ट में एक फ्लोट का अनुवाद कर सकता हूं?

+1

अरे, बस पूछने में मेरे प्रश्न का उत्तर देने के लिए धन्यवाद कहना चाहता था। मुझे पता होना चाहिए कि सी ++ में फ्लोट/int रूपांतरण कैसे करें; – LaikaN57

उत्तर

10

आपको निश्चित रूप से जावास्क्रिप्ट में ऐसा कुछ भी निम्न स्तर नहीं मिलता है। अविश्वसनीय संभावित हमलावर वेबसाइटों के उपयोग के लिए सुरक्षित होने वाली भाषा में पुनरावृत्ति और पॉइंटर-फ्रोबिंग को अनुमति देना बेहद खतरनाक होगा।

यदि आप किसी संख्या में एकल-सटीक मान का 32-बिट IEEE754 प्रतिनिधित्व प्राप्त करना चाहते हैं (जो याद है कि कोई int नहीं है; जावास्क्रिप्ट में आपको प्राप्त होने वाला एकमात्र नंबर प्रकार double है), आपको बनाना होगा यह खुद को हस्ताक्षर, एक्सपोनेंट और मंथिसा बिट्स को एक साथ जोड़कर। उदाहरण कोड here है।

+3

+1 मुझे फ्रोबिंग शब्द को पुन: पेश करने के लिए +1। –

+0

बस babbage.cs.qc.edu साइट में जावास्क्रिप्ट पर एक नज़र डालें - यह सही उत्तरों का उत्पादन कर सकता है, और ऑनलाइन कैलक्यूलेटर पर अच्छी तरह से काम कर सकता है, लेकिन यह मेरी राय में पुन: उपयोग करने के लिए बेहद लिखित और उपयुक्त नहीं है। –

+4

मैं यह देखने में असफल रहा कि एक जावास्क्रिप्ट नंबर से मूल आईईईई बाइनरी प्रारूप रूपांतरण क्यों जोड़ना एक सुरक्षा समस्या होगी। इस मामले में कोई पुनरावृत्ति या पॉइंटर्स शामिल नहीं है। – akauppi

-1

अन्य पोस्टर्स की तरह, जावास्क्रिप्ट ढीला टाइप किया गया है, इसलिए फ्लोट से int या इसके विपरीत डेटा प्रकारों में कोई अंतर नहीं है।

Math.floor(3.9); // result: 3 (truncate everything past .) or 
Math.round(3.9); // result: 4 (round to nearest whole number) 

पर आप चाहें जो निर्भर करता है:

हालांकि, क्या आप देख रहे हैं int करने के लिए

नाव है। सी/सी ++ में यह अनिवार्य रूप से फ्लोट से पूर्णांक में कनवर्ट करने के लिए Math.floor का उपयोग करेगा।

पूर्णांक फ्लोट करने के लिए:

var a = 10; 
a.toFixed(3); // result: 10.000 
+0

इसलिए प्रति पुनरावृत्ति आप एक दूसरे के 0.000000455 उठा रहे हैं, कूल स्टोरी ब्रो –

+0

वह वह नहीं देख रहा है। वह एक डबल के द्विआधारी प्रतिनिधित्व की तलाश में है। प्रश्न में '(int *) और a' डबल के मशीन-स्तर (आईईईई) बिट्स को एक पॉइंटर देता है। – akauppi

2
function FloatToIEEE(f) 
{ 
    var buf = new ArrayBuffer(4); 
    (new Float32Array(buf))[0] = f; 
    return (new Uint32Array(buf))[0]; 
} 

दुर्भाग्य से, इस युगल के साथ और पुराने ब्राउज़रों में काम नहीं करता।

14
function DoubleToIEEE(f) 
{ 
    var buf = new ArrayBuffer(8); 
    (new Float64Array(buf))[0] = f; 
    return [ (new Uint32Array(buf))[0] ,(new Uint32Array(buf))[1] ]; 
} 
+1

और दूसरी दिशा (बाइट्स से फ्लोट तक), देखें: http://stackoverflow.com/a/21282715/1691517। –

0
  1. जावास्क्रिप्ट double (आईईईई 754) का उपयोग करता है सभी नंबरों
  2. double [संकेत है, प्रतिपादक (11bit), अपूर्णांश (52bit)] क्षेत्रों के होते हैं प्रतिनिधित्व करते हैं। संख्या का मूल्य सूत्र (-1)^sign * (1.mantissa) * 2^(exponent - 1023) का उपयोग करके गणना की जाती है। (1.mantissa - मतलब है कि हम अपूर्णांश के टुकड़े संख्या के रूप में शुरुआत में 1 जोड़ सकते हैं और है कि मूल्य पर चलने लेते हैं, जैसे अगर अपूर्णांश = 101 हम नंबर 1.101 (bin) = 1 + 1/2 + 1/8 (dec) = 1.625 (dec) मिल
  3. हम sign सा परीक्षण के मूल्य यदि संख्या शून्य से अधिक है प्राप्त कर सकते हैं।। क्योंकि double+0 और -0 मान हो वहाँ 0 साथ एक छोटा सा मुद्दा यहाँ है, लेकिन हम कंप्यूटिंग 1/value और पता चल सके कि मूल्य +Inf या -Inf है द्वारा इन दोनों को अलग कर सकते हैं।
  4. 1 <= 1.mantissa < 2 जब से हम Math.log2 जैसे का उपयोग कर प्रतिपादक का मूल्य प्राप्त कर सकते हैंMath.floor(Math.log2(666.0)) = 9 तो प्रतिपादक exponent - 1023 = 9 और exponent = 1032, जो बाइनरी में (1032).toString(2) = "10000001000"
  5. है के बाद हम प्रतिपादक हम अपूर्णांश, value = value/Math.pow(2, Math.floor(Math.log2(666.0))) बदले बिना शून्य प्रतिपादक करने के लिए संख्या पैमाने पर कर सकते हैं, अब मूल्य संख्या (-1)^sign * (1.mantissa) का प्रतिनिधित्व करता है हो जाता है। अगर हम 2^52 द्वारा साइन को अनदेखा करते हैं और गुणा करते हैं तो हमें पूर्णांक मान मिलता है जिसमें 1. बिटिस: ((666/Math.pow(2, Math.floor(Math.log2(666)))) * Math.pow(2, 52)).toString(2) = "10100110100000000000000000000000000000000000000000000" (हमें अग्रणी 1 को अनदेखा करना होगा)।
  6. के बाद कुछ स्ट्रिंग concat के आप आप क्या चाहते हैं

इस अवधारणा का ही प्रमाण है, हम denormalized संख्या या इस तरह के NaN के रूप में विशेष मूल्यों चर्चा नहीं की है मिल जाएगा - लेकिन मुझे लगता है कि खाते में विस्तार किया जा सकता इन मामलों के लिए भी।

@bensiu उत्तर ठीक है, लेकिन अगर आप अपने पुराने जेएस दुभाषिया का उपयोग कर पाते हैं तो आप इस दृष्टिकोण का उपयोग कर सकते हैं।

संबंधित मुद्दे