x86-64 머신 코드, 14 바이트
이 프로토 타입을 사용하여 C (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);
이것은 C 및 Java 응답과 동일한 비트 교환 알고리즘을 사용합니다. 두 문자가 모두 같은 경우 변경하지 않아도됩니다. 반대의 경우에는 둘 다 변경해야합니다.
XOR을 사용하여 두 문자열의 대소 문자를 구분하십시오. mask = (a XOR b) AND 0x20
같으면 0, 차이는 0x20입니다. a ^= mask; b ^= mask
caseflip은 대소 문자가 다르면 두 글자를 모두 씁니다. (상한 및 하한의 ASCII 문자 코드는 비트 5에서만 다릅니다.)
NASM 목록 (부터 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
명령어도 short와 같은 2 바이트 jcc
입니다. scasb
여전히 rdi
1 바이트 명령어 로 증분하는 가장 좋은 방법 입니다. 나는 우리가 할 수 추측 xor al, [rdi]
/ stosb
. 그것은 같은 크기이지만 아마도 더 빠를 것입니다 loop
(memory src + store는 memory dst + reload보다 저렴합니다). 그리고 암시 적 길이의 경우에도 ZF를 적절하게 설정합니다!
온라인으로 사용해보십시오! argv [1], argv [2]에서 호출하고 결과에 sys_write를 사용하는 _start
array[i++%n]+=...;
습니까?array[t=i++%n]=array[t]+...;
잘 작동합니다. 및array[i%n]+=...;i++;
도 잘 작동하지만, 사용i++
또는++i
모듈러와+=
배열의 행에 추가하는 것은 작업 ..하지 않는 예로서, 여기에 10 자바 TIO 문제를보고. Java 10 JDK 또는 Java 10 TIO 컴파일러에서 버그 (또는 기능 : S)입니까?