x86-64 makine kodu, 14 bayt
Bu prototip ile C'den (x86-64 SysV arama sözleşmesi) aranabilir:
void casexchg(char *rdi, char *rsi); // modify both strings in place
Uzunluğu olan açık uzunluklu bir sürüm rcx
aynı boyuttadır. void casexchg(char *rdi, char *rsi, int dummy, size_t len);
Bu, C ve Java cevaplarıyla aynı bit değişimi algo kullanır: Her iki harf aynı ise, her ikisinin de değişmesi gerekmez. Karşı dava ise ikisinin de değişmesi gerekiyor.
İki dizenin büyük / küçük harfini farklılaştırmak için XOR kullanın. mask = (a XOR b) AND 0x20
Aynı için 0, farklı için 0x20. a ^= mask; b ^= mask
her iki harften farklı olsa da caseflip. (Çünkü ASCII üst ve alt harflerin kodları sadece 5 bitinde değişir.)
NASM listelemesi (den nasm -felf64 -l/dev/stdout
). cut -b 26- <casexchg.lst >casexchg.lst
Bunu tekrar monte edebileceğiniz bir şeye dönüştürmek için kullanın .
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
Yavaş loop
komut, kısa olarak aynı 2 bayttır jcc
. scasb
hala rdi
bir tek baytlık komut ile artmanın en iyi yoludur . Ben yapabiliriz sanırım xor al, [rdi]
/ stosb
. Bu aynı boyutta olacaktır ancak loop
durum için muhtemelen daha hızlıdır (memory src + store, hafıza dst + yeniden yüklemesinden daha ucuzdur). Ve yine ZF'yi örtük uzunlukta davaya uygun şekilde ayarlayabilir!
Çevrimiçi deneyin! argv [1] üzerinde çağıran bir _start ile, argv [2] ve sonuçta sys_write kullanılır
array[i++%n]+=...;
mi?array[t=i++%n]=array[t]+...;
iyi çalışıyor; vearray[i%n]+=...;i++;
aynı zamanda iyi çalışır, ancak bir modulo kullanaraki++
veya bir dizi kullanarak bir satır eklemek veya çalışmak değildir .. Burada bir Java 10 TIO problemi görmek için bir örnek. Bu Java 10 JDK'daki veya Java 10 TIO derleyicisindeki bir hata mı (veya özellik: S)?++i
+=