स्ट्रिंग रूपांतरण में लिटिल एंडियन नंबर


13

परिचय

बीएमपी (बिटमैप) जनरेटर के साथ काम के दौरान मैं संख्या को थोड़ा एंडियन हेक्स स्ट्रिंग में परिवर्तित करने की समस्या का सामना करता हूं। यहां वह फ़ंक्शन है जो मैं जावास्क्रिप्ट में बनाता हूं - लेकिन आश्चर्य है कि छोटे कोड इसी तरह कैसे काम कर सकते हैं

let liEnd= num => num.toString(16).padStart(8,'0').match(/../g).reverse().join``;
console.log(liEnd(304767)) // 304767 dec = 0x4a67f hex

चुनौती

फ़ंक्शन लिखें जो इनपुट पर 32 बिट अहस्ताक्षरित पूर्णांक संख्या लेगा, और 8-अंकीय हेक्साडेसिमल स्ट्रिंग को थोड़ा एंडियन ऑर्डर के साथ उत्पन्न करेगा। उदाहरण एल्गोरिथ्म जो काम करते हैं:

  • सुन्न को हेक्स स्ट्रिंग में बदलें उदा: 304767 -> '4a67f'
  • 8-चार स्ट्रिंग प्राप्त करने के लिए पैडिंग शून्य जोड़ें: '0004a67f'
  • चार 2-चार टुकड़ों में विभाजित स्ट्रिंग: '00','04','a6','7f'
  • टुकड़ों का उल्टा क्रम '7f','a6','04','00'
  • टुकड़ों में शामिल हों और परिणाम के रूप में लौटें: '7fa60400'

उदाहरण इनपुट और आउटपुट

इनपुट नंबर (या संख्या के साथ स्ट्रिंग) बाईं ओर है ->, आउटपुट हेक्स स्ट्रिंग दाईं ओर है

2141586432 -> 0004a67f
304767     -> 7fa60400

जवाबों:



6

पायथन 3 , 37 बाइट्स

lambda n:n.to_bytes(4,"little").hex()

इसे ऑनलाइन आज़माएं!

अंकगणित-आधारित पुनरावर्ती समाधान ( 50 49 बाइट्स, पायथन 2 के लिए भी काम करता है ) :

f=lambda n,i=4:i*'1'and"%02x"%(n%256)+f(n>>8,i-1)

इसे ऑनलाइन आज़माएं!

-1 बाइट थैंक्स टू @ जोनाथनअल्लन


मैं कहता हूँ कि पायथन 2 प्रविष्टि के रूप में पुनरावर्ती प्रस्तुत करें :)
जोनाथन एलन

f=lambda n,i=4:i*'1'and'%02x'%(n%256)+f(n>>8,i-1)एक बाइट बचाता है :)
योनातन एलन

@JonathanAllan धन्यवाद मैं सभी पायथन 2 ट्रिक्स से परिचित नहीं हूं और यह नहीं देखता कि इसे छोटा कैसे बनाया जा सकता है।
जोएल

यह नहीं है लेकिन 37 py 2 में काम नहीं करेगा
जोनाथन एलन

हाँ। उन बिल्ट-इन में से कुछ पायथन 3-केवल हैं।
जोएल

6

आर , 54 53 बाइट्स

format.hexmode(scan()%/%256^(0:3)%%256%*%256^(3:0),8)

इसे ऑनलाइन आज़माएं!

2 वर्णों का प्रत्येक समूह वास्तव में आधार 256 में एक अंक का हेक्स प्रतिनिधित्व है। scan()%/%256^(0:3)%%2564 अंकों के साथ एक आधार 256 संख्या में परिवर्तित होता है, ...%*%256^(3:0)उन्हें एक पूर्णांक के रूप में जोड़ता है, और format.hexmode(...,8)उस संख्या को 8 अंकों के साथ अपने हेक्स प्रतिनिधित्व में परिवर्तित करता है।


5

जावास्क्रिप्ट (ईएस 7),  59  57 बाइट्स

स्ट्रिंग हेरफेर।

n=>(n+2**32).toString(16).match(/\B../g).reverse().join``

इसे ऑनलाइन आज़माएं!

कैसे?

n+2320

(304767 + 2**32).toString(16) // --> '10004a67f'

इसे ऑनलाइन आज़माएं!

/\B../g1\B

'10004a67f'.match(/\B../g) // --> [ '00', '04', 'a6', '7f' ]

इसे ऑनलाइन आज़माएं!

हम reverse()और join()अंतिम स्ट्रिंग प्राप्त करने के लिए।


जावास्क्रिप्ट (ईएस 6), 61 बाइट्स

पुनरावर्ती कार्य।

f=(n,k=4)=>k?[(x=n&255)>>4&&'']+x.toString(16)+f(n>>8,k-1):''

इसे ऑनलाइन आज़माएं!


⭐ - आपको अच्छे उत्तर के लिए स्टार मिलता है - मुझे यह पसंद है, छोटा लेकिन फिर भी साफ और "मानव-लाल" ":)
कामिल कीलवस्की


5

सी # (विजुअल सी # इंटरएक्टिव कंपाइलर) , 54 बाइट्स

x=>$"{(x=x>>16|x<<16)>>8&16711935|(x&16711935)<<8:x8}"

4 बाइट्स @PeterCordes की बदौलत सहेजे गए

इसे ऑनलाइन आज़माएं!

व्याख्या

x=>                                                    //Lambda taking in an uint
     (x=x>>16|x<<16)                                   //Swap the first two and the last two bytes of the uint (0x7fa60400 -> 0x04007fa6)
                    >>8&16711935|(x&16711935)<<8       //Swap each pair of bytes in every group of 2 bytes (0x04007fa6 -> 0x0004a67f)
  $"{                                           :x8}"  //Format as hex string, padded with leading zeroes to length 8

आप हटना कर सकते हैं 4278255360करने के लिए मुखौटा निरंतर 16711935( 0xff00ff) यदि आप बदलाव से पहले मास्किंग? या क्या इसके लिए अतिरिक्त पैसे खर्च करने पड़ते हैं? इसके अलावा, यदि नहीं तो 0xff00ff00वही लंबाई है लेकिन मनुष्यों के लिए बहुत अधिक सार्थक है।
पीटर कॉर्ड्स

@PeterCordes यह भी कोष्ठक को हटाने में सक्षम होने का अतिरिक्त लाभ है, >>जिसकी तुलना में उच्च पूर्वता है &, कुल 4 बाइट्स बचाए गए। धन्यवाद!
अज्ञान

ठंडा। आपके "स्पष्टीकरण" अनुभाग में, मैं कॉन्स्टेंट को हेक्स में लिखने का सुझाव दूंगा।
पीटर कॉर्ड्स

4

जाप -P , 10 बाइट्स

sG ùT8 ò w

कोशिश करो

sG ùT8 ò w     :Implicit input of integer
s              :Convert to string
 G             :  In base-16
   ù           :Left pad
    T          :  With 0
     8         :  To length 8
       ò       :Split into 2s
         w     :Reverse
               :Implicitly join and output

क्या करता -Pहै?
एसएस ऐनी

Explanation आपका जवाब सबसे ऊपर है (क्या आप स्पष्टीकरण जोड़ सकते हैं?)
कामिल कील्सेवस्की

@ JL2210 डॉक्स से : " -P: यदि आउटपुट एक सरणी है, तो कोई विभाजक नहीं है (यानी साथ जुड़ गया P)। " इसलिए ध्वज बाइट को बचाने के लिए स्पष्ट जुड़ने के बजाय एक निहित के लिए है। :)
केविन क्रूज़सेन

2
@ KamilKiełczewski, स्पष्टीकरण जोड़ा।
झबरा

4

सी (जीसीसी) , 30 बाइट्स

f(x){printf("%.8x",htonl(x));}

इसे ऑनलाइन आज़माएं!


जब एक बड़े-एंडियन मशीन पर चलाया जाता है, तो यह छोटे-एंडियन में परिवर्तित नहीं होगा?
पीटर फेर्री

@peterferrie संशोधन देखें 3.
एसएस ऐनी

4

पायथन 2 , 43 बाइट्स

lambda n:[("%08x"%n)[i^6]for i in range(8)]

इसे ऑनलाइन आज़माएं!

-4 बाइट्स बे्रनग के लिए धन्यवाद

वर्णों की सूची आउटपुट करता है। आदेश में, इनपुट के हेक्स अंकों को पुनर्प्राप्त करके गणना की जाती है 6, 7, 4, 5, 2, 3, 0, 1


2
[i^6]for i in range(8)कुछ बाइट्स बचाता है।
बेन्ज

क्या इसे स्ट्रिंग के बजाय आउटपुट सूची की अनुमति है?
Qwertiy

सूची के रूप में आउटपुट वास्तव में प्रश्न imo की भावना के लिए फिट नहीं है
qwr

3

सी (जीसीसी) एंडियन अज्ञेयवादी, कोई मानक काम नहीं करता, 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 जैसी पूरी चीज़ का प्रिंटफ़ भी कर सकते हैं


Star - आपको अच्छे उत्तर के लिए स्टार मिलता है
कामिल कीलवस्की

3

x86 SIMD मशीन कोड (AVX512-VBMI), 36 बाइट्स

(16 बाइट्स जिसमें एक हेक्स लुकिंग टेबल है)

यह एक ऐसा फंक्शन है जिसमें कॉल करने के लिए xmm0ASCII चार डेटा का 8 बाइट्स देता है और xmm0जहाँ भी वह चाहता है स्टोर करता है। (उदाहरण के लिए वीडियो मेमोरी को बाइट्स के साथ इंटरलाकिंग करने के बाद, या निर्माणाधीन स्ट्रिंग में, या जो भी हो)

सी से, इसे __m128i retval = lehex(_mm_cvtsi32_si128(x))x86-64 सिस्टम वी कॉलिंग कन्वेंशन, या एमएस विंडोज के साथ कॉल करें vectorcall

# disassembly with machine-code bytes (the answer) and NASM source code.
0000000000401000 <lehex>:
  401000:       c5 f1 72 d0 04          vpsrld      xmm1, xmm0, 4         ; AVX1
  401005:       c5 f1 60 c8             vpunpcklbw  xmm1, xmm1, xmm0      ; AVX1
  401009:    62 f2 75 08 8d 05 01 00 00 00 vpermb  xmm0, xmm1, [rel .hex_lut]
  401013:       c3                      ret    

0000000000401014 <lehex.hex_lut>:
  401014:     30 31 ...  61 62 ...     .hex_lut:  db "0123456789abcdef"

कुल = 0x24 = 36 बाइट्स।

एक संख्या को हेक्स में कैसे परिवर्तित करें देखें ? यह कैसे काम करता है के लिए SO पर। (SSE2 शिफ्ट / पंक के लिए, तब vpermbवह कार्य बचाता है जिसकी हमें आवश्यकता होगी pshufb। SSE2 / SSSE3 के बजाय AVX1 भी एक movapsरजिस्टर कॉपी से बचता है ।)

ध्यान दें कि punpcklbwउस क्रम में स्रोत ऑपरेंड के साथ हमें सबसे कम बाइट तत्व में कम इनपुट बाइट का सबसे महत्वपूर्ण कुतरना होगा, फिर सबसे कम स्रोत बाइट का कम से कम महत्वपूर्ण कुतरना होगा। (उस एसओ उत्तर में, bswapइनपुट का उपयोग केवल SSE2 के साथ मानक मुद्रण क्रम में परिणाम प्राप्त करने के लिए किया जाता है। लेकिन यहां हम उस आदेश को चाहते हैं : प्रत्येक बाइट के भीतर कम तत्व में उच्च कुतरना, लेकिन अभी भी कम-एंडियन बाइट क्रम)।

यदि हमारे पास अधिक डेटा स्थिरांक है, तो हम एक या mov edx, imm32फिर [rdx+16]किसी भी मोड का उपयोग करके एड्रेसिंग-मोड स्पेस को बचा सकते हैं। या vpbroadcastb xmm0, [rdx+1]

लेकिन मुझे लगता है कि एक 16-बाइट हेक्स LUT + vpermbअभी भी n>9 : n+'a'-10 : n+'0'स्थिति को लागू करने से बेहतर है : जिसमें 3 स्थिरांक और AVX512BW बाइट-मास्किंग (मास्क vpaddb, मर्ज-नकाबपोश की तुलना vpaddb), या AVX1 या SSE2 के साथ कम से कम 3 निर्देशों की आवश्यकता होती है । (देखें कि एक संख्या को हेक्स में कैसे परिवर्तित किया जाए? उस के SSE2 संस्करण के लिए SO पर)। और प्रत्येक AVX512BW निर्देश कम से कम 6 बाइट्स लंबा (4-बाइट EVEX + opcode + modrm) है, जो एड्रेसिंग मोड में एक विस्थापन के साथ लंबा है।

वास्तव में इसकी तुलना में कम से कम 4 निर्देश होंगे क्योंकि हमें तुलना करने से पहले andps(या vpanddएक 4-बाइट प्रसारण मेमोरी ऑपरैंड के साथ EVEX) के साथ उच्च कचरा साफ़ करने की आवश्यकता है । और उनमें से प्रत्येक को एक अलग वेक्टर स्थिरांक की आवश्यकता होती है। AVX512 ने मेमोरी ऑपरेंड का प्रसारण किया है, लेकिन केवल 32-बिट और व्यापक के तत्वों के लिए। उदाहरण के लिए EVEXvpaddb का अंतिम संचालन केवल है xmm3/m128, नहीं xmm3/m128/m8bcst। (इंटेल के लोड पोर्ट्स केवल 32 और 64-बिट ब्रॉडकास्ट मुफ्त में एक लोड यूओपी के हिस्से के रूप में कर सकते हैं इसलिए इंटेल ने AVX512BW को प्रतिबिंबित करने के लिए डिज़ाइन किया है और बाइट या वर्ड ब्रॉडकास्ट मेमोरी ऑपरेंड्स को एनकोड करने में सक्षम नहीं है, बजाय उन्हें विकल्प देने के। क्या आप अभी भी अपने स्थिरांक को 4 बाइट्स में संकुचित कर सकते हैं:

SSSE3 / AVX1 के बजाय AVX512VBMI काvpermb उपयोग करने का कारण मैं pshufbदुगना है:

  • vpermbचयनकर्ताओं के उच्च बिट्स को अनदेखा करता है। (v)pshufbनियंत्रण वेक्टर के उच्च बिट के अनुसार शून्य बाइट्स और एक अतिरिक्त pandया andpsवास्तव में nibbles को अलग करने की आवश्यकता होगी । एक्सएमएम / 16-बाइट आकार के साथ, vpermbकेवल शफल-नियंत्रण तत्वों के कम 4 बिट्स को देखता है, अर्थात ऑपरेशन अनुभाग[3:0] में इंटेल के अंकन में बिट्स ।
  • vpermbमेमोरी ऑपरेंड के रूप में डेटा को फेरबदल (लुकअप टेबल) पर ले जा सकते हैं। (v)pshufbका xmm / मेम ऑपरैंड शफल-नियंत्रण वेक्टर है।

ध्यान दें कि AVX512VBMI केवल CannonLake / Ice Lake पर उपलब्ध है, इसलिए आपको शायद Intel के SDE की तरह इसे टेस्ट करने के लिए एक सिम्युलेटर की आवश्यकता होगी।


Star - आपको अच्छे उत्तर के लिए स्टार मिलता है
कामिल कीलक्वेस्की

@ KamilKiełczewski: योग्य धन्यवाद। हेक्स को कुशलता से संख्याओं में बदलना मेरी पसंदीदा चीजों में से एक है। यह कई स्वच्छ चाल और बिट-हेरफेर के लिए एक अच्छा उपयोग-मामला है।
पीटर कॉर्ड्स

3

स्काला , 58 40 36 बाइट्स

"%08X"format Integer.reverseBytes(_)

इसे ऑनलाइन आज़माएं!

अभी भी एक के बाइट्स को उलटने के लिए बिल्टिन का Intउपयोग करता है, लेकिन हेक्स formatके Intरूप में प्रारूपित करने के लिए उपयोग करता है । बुलाने की जरूरत नहीं toHexString

परों को हटा दिया format। अब इसका मतलब है कि तर्क का उपयोग करके स्पष्ट रूप से लिया जा सकता है _


2

फोर्थ (gforth) , 52 51 40 बाइट्स

: f hex 0 4. do <# # # 0. #> type loop ;

इसे ऑनलाइन आज़माएं!

कोड स्पष्टीकरण

: f           \ start a new word definition
  hex         \ set the current base to base 16
  0           \ convert the input number to a double-cell integer
  4. do       \ start a counted loop from 0 to 3
    <# # #    \ start a formatted numeric string and move last 2 digits to format area
    0.        \ move remaining digits down the stack
    #>        \ delete top two stack value and convert format area to string
    type      \ output string
  loop        \ end loop
;             \ end word definition

2

जेली , 13 बाइट्स

+Ø%b⁴Ḋs2Ṛ‘ịØh

इसे ऑनलाइन आज़माएं!

एक पूर्ण प्रोग्राम जो पूर्णांक को अपने तर्क के रूप में लेता है और एक स्ट्रिंग प्रिंट करता है।


Ie आपका जवाब शीर्ष पर है
कामिल किल्सेवस्की


2

एक्सेल, 91 बाइट्स

=RIGHT(DEC2HEX(A1,8),2)&MID(DEC2HEX(A1,8),5,2)&MID(DEC2HEX(A1,8),3,2)&LEFT(DEC2HEX(A1,8),2)

2

K4 , 12 11 बाइट्स

समाधान:

,/$|4_0x0\:

उदाहरण:

q)k),/$|4_0x0\:304767
"7fa60400"
q)0W
"0004a67f"

स्पष्टीकरण:

बहुत सुंदर वास्तव में क्या सवाल पूछता है:

,/$|4_0x0\: / the solution
      0x0\: / split to bytes
    4_      / drop first 4 bytes
   |        / reverse
  $         / convert to string
,/          / flatten

टिप्पणियाँ:

  • K4 नंबर के रूप में -1 बाइट डिफ़ॉल्ट रूप से लार्ज (64 बिट) हैं, इसलिए 4 बाइट्स (32 बिट) को छोड़ना

Ie आपका जवाब शीर्ष पर है
कामिल कीलस्वेस्की

2

PHP , 31 बाइट्स

<?=unpack(H8,pack(V,$argn))[1];

इसे ऑनलाइन आज़माएं!

PHP के पैक और अनपैक का लाभ उठाते हुए , मैं "32 बिट लिटिल एंडियन बाइट ऑर्डर" प्रारूप ( V) के साथ अहस्ताक्षरित इनपुट को एक बाइनरी स्ट्रिंग में पैक करता हूं और फिर इसे "हेक्स स्ट्रिंग, हाई निबल फर्स्ट" प्रारूप ( H) के साथ अनपैक करता हूं और परिणाम प्रिंट करता हूं।

यह उन दुर्लभ मामलों में से एक प्रतीत होता है, जहां PHP का अंतर्निहित इन्स वास्तव में एक साधारण एल्गोरिथ्म को लागू करने से कम है!


PHP के फ़ंक्शन pack()/ unpack()फ़ंक्शन 0 के लिए भयानक हैं, जिनकी आपको कभी भी अधिकांश PHP परियोजनाओं में आवश्यकता होती है। बधाई हो, आपने उनका उपयोग पाया!
640KB

1

चारकोल , 11 बाइट्स

⪫⮌⪪﹪%08xN²ω

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण:

        N   Input as a number
   ﹪%08x    Format using literal string
  ⪪      ²  Split into pairs of characters
 ⮌          Reverse
⪫         ω Join
            Implicitly print

पायथन प्रारूपण का सहारा लिए बिना 19 बाइट्स:

⪫…⮌⪪⍘⁺X²¦³⁶N¹⁶¦²¦⁴ω

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण:

           N        Input as a number
     ⁺              Plus
       ²            Literal 2
      X             To power
         ³⁶         Literal 36
    ⍘               Convert to base
            ¹⁶      Literal 16
   ⪪           ²    Split into pairs of digits
  ⮌                 Reverse the list
 …               ⁴  Take the first 4 pairs
⪫                 ω Join together
                    Implicitly print

Ie आपका जवाब शीर्ष पर है
कामिल किल्सेवस्की


1

जे , 10 बाइट्स

8{._1{3!:3

इसे ऑनलाइन आज़माएं!

किस तरह

3!:3हेक्स प्रतिनिधित्व के लिए एक जे "विदेशी संयोजन" है, जिसे यहां दस्तावेजित किया गया है । यही है, यह हेक्स में परिवर्तित करने के लिए एक अंतर्निहित है। हालाँकि, यह आउटपुट है जो हम चाहते हैं यह काफी नहीं है। जैसे, दौड़ना:

3!:3 (304767)

पैदा करता है:

e300000000000000
0400000000000000
0100000000000000
0000000000000000
7fa6040000000000

अन्य पंक्तियों का अर्थ मुझे ऊपर दिए गए डॉक्स पृष्ठ पर समझाया गया है। किसी भी मामले में, यह स्पष्ट है कि हम अंतिम पंक्ति के पहले 8 वर्ण चाहते हैं।

_1{ अंतिम पंक्ति प्राप्त करें।

8{. इसके पहले 8 अक्षर मिलते हैं।


Ie आपका जवाब शीर्ष पर है
कामिल Kiełczewski

1

रूबी , 31 27 बाइट्स

रात 2 के PHP उत्तर का एक बंदरगाह होने के कारण समाप्त हुआ क्योंकि रूबी में एक ही पैक / अनपैक कार्यक्षमता है।

->*i{i.pack(?V).unpack'H8'}

इसे ऑनलाइन आज़माएं!

मेरा मूल 31-बाइट उत्तर जिसने H8 अनपैक मोड का लाभ नहीं उठाया क्योंकि मुझे इसके बारे में पता नहीं था:

->*i{'%02x'*4%i.pack(?V).bytes}

इसे ऑनलाइन आज़माएं!


1

विंडोज बैच, 90 बाइट्स

@for /l %%x in (24,-8,0)do @set/aa=%1^>^>%%x^&255&cmd/cexit !a!&<nul set/p=!=exitcode:~-2!

विलंबित विस्तार को सक्षम करने के लिए / v के साथ कमांड-लाइन चलाएं।


1

x86 32-बिट मशीन कोड, 24 21 बाइट्स

changelog: -3 बाइट्स: @peter ferrie द्वारा DAS हैक के साथ स्टैंडर्ड ऐड / cmp / jbe / ऐड को बदलें

64-बिट: अभी भी 24 बाइट्स। लॉन्ग मोड ने DAS opcode को हटा दिया।
16-बिट मोड: डिफ़ॉल्ट ऑपरेंड-आकार 16-बिट है, लेकिन समस्या की कल्पना स्वाभाविक रूप से 32-बिट है। जिसमें हार्ड-कोडेड 8 हेक्स अंक शामिल हैं।


bswapतब के साथ बाइट रिवर्स - int int>> मानक क्रम में हेक्स (सबसे महत्वपूर्ण कुतरना पहले, आरोही क्रम में एक चार आउटपुट बफर करने के लिए हेक्स अंक लिखना।) यह बाइट बनाम के बीच नथुने के बीच आदेश स्विच करने के लिए लूप को अनियंत्रित करने से बचता है। बाइट्स के पार।

X86-64 void lehex(char buf[8] /*edi*/, uint32_t x /*esi*/);सिस्टम V की तरह कॉल करने योग्य, इसके अलावा यह 64-बिट मोड में काम नहीं करता है। (इसके लिए EDI में आउटपुट पॉइंटर की जरूरत है stosb। इनपुट नंबर ECX या EAX के अलावा किसी भी रजिस्टर में हो सकता है)

     1                             lehex:
     2 00000000 0FCE                   bswap  esi
     3 00000002 6A08                   push   8            ; 8 hex digits
     4 00000004 59                     pop    ecx
     5                             .loop:                ;do{
     6 00000005 C1C604                 rol    esi, 4       ; rotate high nibble to the bottom
     7                             
     8 00000008 89F0                   mov    eax, esi
     9 0000000A 240F                   and    al, 0x0f     ; isolate low nibble
    10 0000000C 3C0A                   cmp al, 10          ; set CF according to digit <= 9
    11 0000000E 1C69                   sbb al, 0x69        ; read CF, set CF and conditionally set AF
    12 00000010 2F                     das                 ; magic, which happens to work
    13                             
    14 00000011 AA                     stosb               ; *edi++ = al
    15 00000012 E2F1                   loop  .loop       ; }while(--ecx)
    16                             
    17 00000014 C3                     ret

आकार = 0x15 = 21 बाइट्स।

TIO FASM 32-बिट x86 परीक्षण मामले में एक asm कॉलर के साथ writeएक बफर में 2 तारों को जोड़ने के लिए इसे दो बार कॉल करने के बाद आउटपुट लिखने के लिए एक सिस्टम कॉल का उपयोग करता है । अंक बनाम अक्षर के बीच की सीमा पर 9 और A सहित सभी हेक्स अंक 0..F।

DASहैक - 86 कम निबल के बाहर ले जाने के लिए, एक आधा-कैरी झंडा है। डीएएस अनुदेश जैसे पैक-बीसीडी सामान के लिए उपयोगी, दो 2-अंकों वाले बीसीडी पूर्णांक को घटाने के बाद उपयोग के लिए। 0-9 की सीमा के बाहर AL के नीच होने के साथ, हम निश्चित रूप से इसे यहाँ गाली दे रहे हैं।

सूचना if (old_AL > 99H) or (old_CF = 1)तो AL ← AL − 60H;मैनुअल में ऑपरेशन अनुभाग का हिस्सा; sbb हमेशा CF यहाँ सेट करता है ताकि हिस्सा हमेशा होता रहे। ऊपरी मामले के अक्षरों के लिए ASCII रेंज वह है जो पसंद को प्रेरित करती हैsub al, 0x69

  • cmp 0xD, 0xA CF सेट नहीं करता है
  • एसबीबी एएएस को डीएएस के इनपुट के रूप में 0xD - 0x69लपेटता है 0xA4। (और CF सेट करता है, AF को साफ़ करता है)
  • DAS के पहले भाग में कोई AL - = 6 नहीं (क्योंकि 4> 9 गलत है और AF = 0)
  • AL - = 0x60 दूसरे भाग में, 0x44के लिए, ASCII कोड'D'

बनाम एक अंक:

  • cmp 0x3, 0xA CF सेट करता है
  • SBB 3 - 0x69 - 1= अल = 0x99 और सेट सीएफ और वायुसेना
  • कोई AL - = 6 DAS के पहले भाग में (9> 9 गलत है लेकिन AF सेट है), 0x93 को छोड़कर
  • AL - = 0x60 दूसरे भाग में, 0x33 को छोड़कर, के लिए ASCII कोड '3'

0x6aSBB में घटाना AF को हर अंक <= 9 के लिए सेट करेगा ताकि सभी अंक एक ही तर्क का पालन करें। और इसे हर अल्फ़ाबेटिक हेक्स अंक के लिए साफ़ करें। यानी डीएएस के 9 / ए विभाजन से निपटने का सही ढंग से शोषण।


आम तौर पर (प्रदर्शन के लिए) आप एक स्केलर लूप के लिए लुकअप टेबल या संभवतः एक शाखा रहित 2x leaऔर cmp/cmovसशर्त जोड़ का उपयोग करेंगे। लेकिन 2-बाइट al, imm8निर्देश कोड-आकार के लिए एक बड़ी जीत है।


x86-64 संस्करण संस्करण : बस वह हिस्सा जो अलग, बीच and al, 0xfऔर है stosb

;; x86-64 int -> hex  in 8 bytes
    10 0000000C 0430                   add    al, '0'
    11 0000000E 3C39                   cmp    al, '9'
    12 00000010 7602                   jbe  .digit
    13 00000012 0427                     add    al, 'a'-10 - '0'     ; al =  al>9 ? al+'a'-10 : al+'0'
    14                             .digit:

ध्यान दें कि add al, '0' हमेशा चलता है, और सशर्त जोड़ केवल / के बजाय इसे बनाने के लिए 'a'-10और '0', के बीच का अंतर जोड़ता है ।ififelse

परीक्षण और काम करता है, मेरे सी उत्तर केmain रूप में उसी कॉलर का उपयोग करता है, जो उपयोग करता है और ।char buf[8]printf("%.8s\n", buf)


क्या आप यहाँ उदाहरण के लिए ऑनलाइन वर्किंग स्निपेट बना सकते हैं ?
कामिल Kiełczewski 10

@ KamilKiełczewski: TIO यह असंभव बनाता है (AFAIK) सी में कॉलर को लिखने के लिए एक एशम फ़ंक्शन का परीक्षण करें ताकि मैं अक्सर परेशान न हो, लेकिन यकीन है कि जब से आपने पूछा और sys_writeनिश्चित लंबाई के तार आसानी से आउटपुट कर सकते हैं। ओह दिलचस्प है, मुझे एहसास नहीं हुआ था कि TIO पर FASM ने आपको 32-बिट निष्पादन योग्य बनाने दिया था, NASM के साथ जहां यह सम्मान नहीं करता है -felf32। मैं वैसे भी x86-64 पसंद करता हूं, और यह उत्तर 32-बिट कोड से किसी भी बाइट को नहीं बचाता है।
पीटर कॉर्ड्स

Star - आपको अच्छे उत्तर के लिए स्टार मिलता है
कामिल कीलक्वेस्की

1
@ JL2210: क्या आपका मतलब है sprintf? मुझे नहीं लगता कि libc के पास प्रारूप-स्ट्रिंग आधारित लोगों के अलावा किसी भी प्रकार के इंट-स्ट्रिंग कार्य हैं, केवल स्ट्रिंग-> inttt जैसे strtoul। लेकिन हाँ, bswap / printf शायद कम होगा, यदि आप किसी गतिशील लाइब्रेरी में फ़ंक्शन (6-बाइट call [rel printf wrt ..got]कॉल साइट के अलावा) के लिए GOT प्रविष्टि के लिए बाइट्स गिनने का कोई तरीका निकाल सकते हैं ; एक न्यूनतम सांख्यिकीय रूप से जुड़े निष्पादन योग्य गतिशील से काफी छोटा हो सकता है, कम से कम जब ldसामान्य चूक के साथ बनाया जाता है । लेकिन मुझे नहीं लगता कि इसे वैधानिक रूप से जोड़ना उचित होगा लेकिन इसके कोड का आकार नहीं।
पीटर कॉर्ड्स

1
@ JL2210: याद रखें, यह एक x86 मशीन कोड का उत्तर है, न कि asm टेक्स्ट सोर्स का आकार। मैंने पिछले मशीन-कोड उत्तरों में libc फ़ंक्शन का उपयोग नहीं किया है, केवल लिनक्स सिस्टम कॉल (जैसे फिबोनाची में), और IDK मैं लागत की गिनती के बारे में कैसे जाऊंगा या क्या मैं मशीन-कोड-साथ-libc जवाब लिखना चाहता हूं । X86 मशीन कोड के लिए उपयोग-मामले हैं जहां एक libc उपलब्ध नहीं है, उदाहरण के लिए बूटलोडर में।
पीटर कॉर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.