利用 ASCII 碼表中大小寫字母相差 32 (0x20) 的特性,僅用 ADD/SUB 指令即可實現極高效的大小寫轉換,無需分支判斷。
'A' = 65 (0x41) = 0100 0001b 'a' = 97 (0x61) = 0110 0001b 差值 = 32 (0x20) = 0010 0000b ← 僅第 5 位不同
{ 小寫轉大寫:減 32 或減 'a'-'A' }
function LowerToUpper(C: Char): Char;
asm
sub C, 32
{ sub C, 'a'-'A' 亦可,編譯器常數折疊 }
end;
{ 大寫轉小寫:加 32 }
function UpperToLower(C: Char): Char;
asm
add C, 32
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(LowerToUpper('b')); { 'B' }
ShowMessage(UpperToLower('B')); { 'b' }
end;
function ToggleCase(C: Char): Char;
asm
xor C, 32 { 翻轉第 5 位:大↔小 }
end;
XOR 32 同時處理大轉小、小轉大,且對非字母字符 (數字、符號) 也會翻轉第 5 位,使用時需配合範圍檢查或查表法。
| 方法 | 指令數 | 分支預測 | 適用場景 |
|---|---|---|---|
| ASCII ADD/SUB | 1 | 無 | 已知字母範圍 |
| XOR 32 | 1 | 無 | 批次翻轉、混合文本 |
| Delphi UpCase/LowerCase | 函數調用 | 內部有分支 | 通用、Unicode 安全 |
| 查表法 (256 bytes) | 1 次內存讀取 | 無 | 極高頻、SIMD 並行 |