Código de máquina x86-64, 14 bytes
Se puede llamar desde C (convención de llamadas SysV x86-64) con este prototipo:
void casexchg(char *rdi, char *rsi); // modify both strings in place
Una versión de longitud explícita con longitud rcx
es del mismo tamaño. void casexchg(char *rdi, char *rsi, int dummy, size_t len);
Utiliza el mismo algoritmo de intercambio de bits que las respuestas de C y Java: si ambas letras son el mismo caso, ninguna necesita cambiar. Si son el caso opuesto, ambos deben cambiar.
Use XOR para diferenciar el bit de mayúsculas y minúsculas de las dos cadenas. mask = (a XOR b) AND 0x20
es 0 para igual o 0x20 para diferente. a ^= mask; b ^= mask
caseflip ambas letras si fueran mayúsculas y minúsculas. (Debido a que los códigos de letras ASCII para superior e inferior difieren solo en el bit 5).
Listado NASM (desde nasm -felf64 -l/dev/stdout
). Use cut -b 26- <casexchg.lst >casexchg.lst
para volver a convertir esto en algo que pueda armar.
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
La loop
instrucción lenta también es de 2 bytes, igual que un corto jcc
. scasb
sigue siendo la mejor manera de aumentar rdi
con una instrucción de un byte. Supongo que podríamos xor al, [rdi]
/ stosb
. Sería del mismo tamaño pero probablemente más rápido para elloop
caso (la memoria src + store es más barata que la memoria dst + reload). ¡Y todavía establecería ZF apropiadamente para el caso de longitud implícita!
Pruébalo en línea! con un _start que lo llama en argv [1], argv [2] y usa sys_write en el resultado
array[i++%n]+=...;
?array[t=i++%n]=array[t]+...;
funciona bien; yarray[i%n]+=...;i++;
funciona bien también, pero usari++
o++i
con un módulo y+=
agregar a una fila en una matriz no funciona. Aquí un Java 10 TIO como ejemplo para ver el problema. ¿Es esto un error (o característica: S) en el Java 10 JDK o en el compilador Java 10 TIO?