codice macchina x86-64, 14 byte
Callable da C (convenzione di chiamata SysV x86-64) con questo prototipo:
void casexchg(char *rdi, char *rsi); // modify both strings in place
Una versione di lunghezza esplicita con lunghezza in ha rcxle stesse dimensioni. void casexchg(char *rdi, char *rsi, int dummy, size_t len);
Questo utilizza lo stesso algo a scambio di bit delle risposte C e Java: se entrambe le lettere sono nello stesso caso, nessuna delle due deve cambiare. Se sono opposti, entrambi devono cambiare.
Utilizzare XOR per diff il bit case delle due stringhe. mask = (a XOR b) AND 0x20è 0 per lo stesso o 0x20 per diverso. a ^= mask; b ^= maskcapovolgi entrambe le lettere se fossero lettere opposte. (Poiché i codici delle lettere ASCII per le lettere superiore e inferiore differiscono solo per il bit 5.)
Elenco NASM (da nasm -felf64 -l/dev/stdout). Usa cut -b 26- <casexchg.lst >casexchg.lstper trasformare questo in qualcosa che puoi assemblare.
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
Anche l' loopistruzione lenta è di 2 byte, uguale a una breve jcc. scasbè ancora il modo migliore per incrementare rdicon un'istruzione a un byte. Immagino che potremmo xor al, [rdi]/ stosb. Sarebbe la stessa dimensione ma probabilmente più veloce per illoop caso (memory src + store è più economico di memory dst + ricaricare). E impostarebbe ZF in modo appropriato per il caso di lunghezza implicita!
Provalo online! con un _start che lo chiama su argv [1], argv [2] e usa sys_write sul risultato
array[i++%n]+=...;?array[t=i++%n]=array[t]+...;funziona bene; earray[i%n]+=...;i++;funziona anche bene, ma usarei++o++icon un modulo e+=aggiungere a una riga in un array non funziona. Qui un TIO Java 10 come esempio per vedere il problema. È un bug (o funzione: S) nel Java 10 JDK o nel compilatore Java 10 TIO?