2009-08-21 8 views
5

मुझे जावा के साथ अपने सभी कामों में प्रवेश करना है, मैंने कभी जावा यूनियन की आवश्यकता नहीं ली है (जैसे सी यूनियन, एसक्यूएल एक नहीं) और मुझे SO पर कोई जवाब नहीं मिल रहा है। माना जाता है कि, जावा में मेरा अधिकांश काम बिट-फिडलिंग की तुलना में अधिक अबास्ट्रक्शन पर रहा है।मैं फ्लोट में अलग-अलग बिट्स कैसे प्राप्त/सेट कर सकता हूं?

मेरे पास एक पूर्णांक है जिसके लिए मैं अलग-अलग बिट्स सेट कर रहा हूं और मैं बराबर आईईईई 754 एकल-परिशुद्धता फ्लोट मुद्रित करना चाहता हूं।

union { 
    int i; 
    float f; 
} x; 
x.i = 0x27; 
printf ("%f\n", x.f); 

मैं जावा में एक समान काम करते हैं कैसे करते हैं:

सी में, मैं की तरह कुछ करना चाहते हैं? क्या जावा में दो अलग-अलग डेटा प्रकारों के समान स्मृति का इलाज करना भी संभव है?

मैंने "जावा यूनियन" के लिए एसओ और अन्य जगहों पर खोज की लेकिन यह मुझे एसक्यूएल सामान के साथ घुमाया - मुझे ऐसा करने का कोई तरीका नहीं मिला।

उत्तर

12

मैं एक पूर्णांक जो मैं के लिए अलग-अलग बिट्स सेट कर रहा हूं है और मैं प्रिंट के लिए बाहर चाहते हैं बराबर आईईईई 754 सिंगल-प्रेसिजन फ्लोट।

इसके लिए intBitsToFloat() का उपयोग करें।

+0

बैंग। यही वह था जो मैं बाद में था। और मुझे लगता है कि रिवर्स Float.floatToRawIntBits है। अब मुझे केवल डबल/लांग संस्करण की आवश्यकता है, लेकिन मुझे लगता है कि अगर कोई है, तो यह डबल क्लास में होगा। मुझे वह मिल जाएगा। बहुत बहुत धन्यवाद। – paxdiablo

+2

मैं अभी भी उलझन में हूं ... इसे यूनियनों के साथ क्या करना है? – skaffman

+0

और +1। – paxdiablo

9

Substitutes for Missing C Constructs

जावा भाषा प्रोग्रामिंग के डिजाइनर संघ निर्माण न करने का एक भी डेटा विभिन्न प्रकार के वस्तुओं प्रतिनिधित्व करने में सक्षम प्रकार परिभाषित करने के लिए एक बहुत बेहतर व्यवस्था नहीं है क्योंकि वहाँ चुना है: subtyping। एक भेदभाव संघ वास्तव में एक वर्ग पदानुक्रम के पैलीड अनुकरण है।

उदाहरण शामिल हैं।

+0

हां, लेकिन यहां एक वर्ग पदानुक्रम अच्छा नहीं है। मैं इसे एक प्रकार के रूप में सेट करने और इसे दूसरे के रूप में पढ़ने में सक्षम होना चाहता हूं। एक वर्ग पदानुक्रम मुझे इसे स्थापित करने और इसे उसी प्रकार के रूप में पढ़ने के लिए मजबूर करेगा। – paxdiablo

+0

+1 बहुत अच्छे लिंक के लिए +1 – dfa

+0

चलो बैक अप - क्या फ्लोट में एक बिट बदलने का कोई तरीका है? यही कारण है कि मैं क्या देख रहा हूँ है।मैं यह देखने के लिए फ्लोट के 31, 27, 4, और 0 बिट्स (उदाहरण के लिए) सेट करने में सक्षम होना चाहता हूं। – paxdiablo

5

जावा कच्चे बिट स्तर पर किसी अन्य मूल्य के रूप में मूल्य का इलाज करने का कोई तरीका नहीं प्रदान करता है - कोई यूनियन नहीं, reinterpret_cast जैसे कुछ भी नहीं। हालांकि, floatint के रूप में इलाज के आपके विशेष मामले के लिए और इसके विपरीत, आप java.lang.Float.floatToIntBits और intBitsToFloat विधियों का उपयोग कर सकते हैं।

+0

+1, भले ही @ एमबी ने आपको इसे हराया। धन्यवाद। – paxdiablo

4

आप एक नाव के बिट स्तरीय प्रतिनिधित्व पहुँचने में रुचि रखते हैं, java.lang.Double सूचक प्रकार के बीच यह करने के लिए विधि (doubleToLongBits आदि)

Union'ing शामिल (या संकेत और के बीच उनके संख्यात्मक represetantion) प्रकार प्रणाली में छेद खुल जाएगा, तो यह सख्ती से असंभव है।

+1

+1। और यह मेरी खोज को खत्म कर देता है (मुझे इसके बाद डबल/लम्बे समय की आवश्यकता होगी)। टा। – paxdiablo

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