x86-64 মেশিন কোড, 14 বাইট
এই প্রোটোটাইপের সাহায্যে সি (x86-64 SysV কলিং কনভেনশন) থেকে কলযোগ্য:
void casexchg(char *rdi, char *rsi); // modify both strings in place
দৈর্ঘ্য সহ একটি স্পষ্ট দৈর্ঘ্যের সংস্করণ rcx
একই আকার। void casexchg(char *rdi, char *rsi, int dummy, size_t len);
এটি সি এবং জাভা উত্তরের মতো একই বিট-এক্সচেঞ্জ আলগো ব্যবহার করে: উভয় অক্ষর যদি একই রকম হয় তবে দুটিও পরিবর্তন করার প্রয়োজন নেই। যদি তারা বিপরীত ক্ষেত্রে থাকে তবে তাদের উভয়েরই পরিবর্তন হওয়া দরকার।
দুটি স্ট্রিংয়ের কেস বিটকে আলাদা করতে এক্সওআর ব্যবহার করুন। mask = (a XOR b) AND 0x20
পৃথক হওয়ার জন্য 0 সমান বা 0x20। a ^= mask; b ^= mask
কেসফ্লিপ উভয় অক্ষর যদি তারা বিপরীত ক্ষেত্রে ছিল। (কারণ উচ্চ এবং নিম্নের জন্য ASCII লেটার কোডগুলি কেবল বিট 5 এর মধ্যে পৃথক রয়েছে))
এনএএসএম তালিকা (থেকে nasm -felf64 -l/dev/stdout
)। cut -b 26- <casexchg.lst >casexchg.lst
আপনি একত্র করতে পারেন এমন কিছুতে এটিকে ফিরিয়ে আনতে ব্যবহার করুন ।
addr machine
6 code global casexchg
7 bytes casexchg:
8 .loop:
9 00000000 AC lodsb ; al=[rsi] ; rsi++
10 00000001 3207 xor al, [rdi]
11 00000003 2420 and al, 0x20 ; 0 if their cases were the same: no flipping needed
12
13 00000005 3007 xor [rdi], al ; caseflip both iff their cases were opposite
14 00000007 3046FF xor [rsi-1], al
15
16 0000000A AE scasb ; cmp al,[rdi] / inc rdi
17 ; AL=0 or 0x20.
18 ; At the terminating 0 in both strings, AL will be 0 so JNE will fall through.
19 ; 0x20 is ASCII space, which isn't allowed, so AL=0x20 won't cause early exit
20 0000000B 75F3 jne .loop
21 ; loop .loop ; caller passes explict length in RCX
22
23 0000000D C3 ret
size = 0xe bytes = 14
24 0000000E 0E db $ - casexchg_bitdiff
ধীর loop
নির্দেশ এছাড়াও 2 বাইট, অল্প হিসাবে একই jcc
। ওয়ান-বাইট নির্দেশ সহ scasb
বর্ধনের সর্বোত্তম উপায় way rdi
আমি অনুমান করি আমরা xor al, [rdi]
/ করতে পারি stosb
। এটি একই আকারের তবে কেসটির জন্য সম্ভবত দ্রুত loop
(মেমরি এসসিআর + স্টোর মেমরি ডিএসটি + পুনরায় লোডের চেয়ে সস্তা)। এবং এখনও অন্তর্নির্মিত দৈর্ঘ্যের ক্ষেত্রে জেডএফ উপযুক্তভাবে সেট করতে হবে!
এটি অনলাইন চেষ্টা করুন! একটি _ স্টার্ট সহ যা এটিকে আরজিভি [1], আর্গভ [2] এ কল করে এবং ফলাফলটিতে s__writte ব্যবহার করে
array[i++%n]+=...;
?array[t=i++%n]=array[t]+...;
ঠিকভাবে কাজ করে; এবংarray[i%n]+=...;i++;
পাশাপাশি সূক্ষ্মভাবে কাজ করে তবে একটি মডিউল ব্যবহার করেi++
বা একটি অ্যারেতে একটি সারিতে সংযোজন কাজ করে না .. সমস্যাটি দেখার জন্য এখানে একটি জাভা 10 টিআইওর উদাহরণস্বরূপ। এটি কি জাভা 10 জেডিকে বা জাভা 10 টিআইও সংকলকটিতে বাগ (বা বৈশিষ্ট্য: এস)?++i
+=