सी (जीसीसी) एंडियन अज्ञेयवादी, कोई मानक काम नहीं करता, 92 91 बाइट्स
h(n)एकल-अंक पूर्णांक-> हेक्स हेल्पर फ़ंक्शन है।
f(x,p)एक पूर्णांक और एक char[8]सूचक लेता है । परिणाम charडेटा के 8 बाइट्स है । ( जब तक कि कॉलर ऐसा न करे, 0-टर्मिनेटेड नहीं)
मान्यताओं: ASCII वर्ण सेट। 2 की पूरक intइतनी सही पारी अंततः साइन बिट को नीचे लाती है, और उच्च बिट सेट होने पर बिट-पैटर्न को मून uint32_tकरने के लिए परिवर्तित intनहीं करता है। intकम से कम 32-बिट है। (विडर इसे 1 के पूरक या संकेत-परिमाण C के कार्यान्वयन पर काम करने दे सकता है)।
गैर-धारणाएँ: कार्यान्वयन बाइट-ऑर्डर या हस्ताक्षर के बारे में कुछ भी char।
i;h(n){n&=15;return n>9?n+87:n+48;}f(x,p)char*p;{for(i=5;--i;x>>=8)*p++=h(x>>4),*p++=h(x);}
इसे ऑनलाइन आज़माएं! printf("%.8s\n", buf)0-टर्मिनेट किए बिना आउटपुट बफर प्रिंट करने के लिए टेस्ट कॉलर का उपयोग करना।
Ungolfed:
int h(n){n&=15;return n>9 ? n+'a'-10 : n+'0';} // single digit integer -> hex
int i;
void ungolfed_f(x,p)char*p;{
for(i=5; --i; x>>=8) // LS byte first across bytes
*p++=h(x>>4), // MS nibble first within bytes
*p++=h(x);
}
n&=15;भीतर करना h(x)तोड़ना है, सम बनाना है; 6 बाइट्स बनाम 3 प्रत्येक के लिए &15दोनों कॉल साइटों पर कम कुतरना अलग करने के लिए।
,एक अनुक्रम बिंदु (या आधुनिक शब्दावली में समतुल्य) है, इसलिए ऑपरेटर *p++= stuffद्वारा अलग किए जाने पर एक बयान में दो बार करना सुरक्षित है ,।
>>हस्ताक्षरित पूर्णांक पर अंकगणित या तार्किक के रूप में कार्यान्वयन-परिभाषित किया गया है। GNU C इसे अंकगणितीय 2 के पूरक के रूप में परिभाषित करता है। लेकिन किसी भी 2 के पूरक मशीन पर यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि हम कभी भी शिफ्ट-इन 0s या साइन बिट की प्रतियों को नहीं देखते हैं। मूल MSB अंततः कम बाइट अपरिवर्तित में उतर जाएगा। यह साइन / परिमाण पर मामला नहीं है, और मैं 1 के पूरक के बारे में निश्चित नहीं हूं।
तो यह केवल 2 के पूरक सी कार्यान्वयन के लिए पोर्टेबल हो सकता है। (या जहां intहै व्यापक से 32 बिट तो थोड़ा 31 परिमाण के सिर्फ एक हिस्सा है।) अहस्ताक्षरित -> हस्ताक्षर किए रूपांतरण भी munges नकारात्मक पूर्णांक के लिए थोड़ा-पैटर्न है, तो &15एक पर intकेवल 2 के पूरक पर मूल अहस्ताक्षरित मूल्य की निबल निकालने होगा। दोबारा, जब तक कि 32-बिट से अधिक व्यापक नहीं intथा , इसलिए सभी इनपुट गैर-नकारात्मक हैं।
गोल्फ संस्करण में गैर-शून्य फ़ंक्शन के अंत में गिरने से यूबी है। मान वापस करने के लिए नहीं, केवल voidडिफ़ॉल्ट के बजाय इसे घोषित करने से बचने के लिए int। आधुनिक कंपाइलर सक्षम किए गए अनुकूलन के साथ इसे तोड़ देंगे।
प्रेरणा: मैं एक x86 या एआरएम थम्ब एसम उत्तर पर विचार कर रहा था, सोचा कि सी में मैन्युअल रूप से इसे करने के लिए मज़ेदार हो सकता है, शायद कंपाइलर-उत्पन्न एएसएम के लिए एक प्रारंभिक बिंदु के रूप में। देखें /programming/53823756/how-to-convert-a-number-to-hex गति-कुशल x86 asm के लिए, एक AVX512VBMI संस्करण सहित केवल 2 निर्देश हैं (लेकिन vpmultishiftqb और vpshufb के लिए नियंत्रण वैक्टर की आवश्यकता है) तो गोल्फ के लिए बहुत अच्छा नहीं होगा)। आम तौर पर यह SIMD के लिए बाइट-एंडियन x86 पर प्रिंटिंग ऑर्डर में बाइट-रिवर्स के लिए अतिरिक्त काम करता है, इसलिए यह बाइट-रिवर्स हेक्स आउटपुट वास्तव में सामान्य से अधिक आसान है।
अन्य विचार
मैंने संदर्भ को देखते हुए और इसके बाइट्स पर लूपिंग char*को एक छोटे से एंडियन सी कार्यान्वयन (जैसे x86 या एआरएम) पर लिया। लेकिन मुझे नहीं लगता कि इससे ज्यादा बचत होती।
sprintfएक समय में 1 बाइट करने के लिए, गोल्फिंग के बाद 64 बाइट्स का उपयोग करना :
int i;
void f(x,p)char*p;{
for(i=4;sprintf(p,"%.2x",x&255),--i;x>>=8)
p+=2;
}
लेकिन अगर हम प्रिंटफ-जैसे फ़ंक्शन का उपयोग कर रहे हैं तो हम बाइट-स्वैप कर सकते हैं और @ JL2210 के उत्तर%x जैसी पूरी चीज़ का प्रिंटफ़ भी कर सकते हैं ।