巧用位運算實現大小寫轉換

2021-07-25 15:31:50 字數 1430 閱讀 2616

今天看王爽老師的《組合語言》時,很有收穫,不論是技術還是思考方式。

任務是將字串進行大小寫轉換,但是還暫時不會用分支判斷語句(而且這樣的效率也不是最高的,有點類似於高階語言了)。

「如果乙個問題的解決方法,使我們陷入一種矛盾之中。那麼,很可能是我們考慮問題的出發點有了問題,或是說,我們起初運用的規律並不適合。」(強行被王老師灌了一碗雞湯,爽!)

扯點淡:這兩天正好遇到一點事情,使我略微開始懷疑自己,(當然也沒那麼嚴重,卓教授可是非常厲害的,承載了太多期許的目光,豈能輕言放棄。不能把世界交給我看不起的人!),所以王老師的這句話使我,換一種思考方式,也許會柳暗花明。

初步想法是,判斷字元的ascii碼,如果大於61h,則減20h。但是沒有判斷語句,所以這條道走不通。

我們應該重新觀察,尋找新的規律。可以看出,就ascii碼的二進位制形式來看,除第5位(位數從0開始計算)外,大寫字母和小寫字母的其他各位都一樣。大寫字母ascii碼的第5位為0,小寫字母的第5位為1。這樣,我們就有了新的方法,乙個字母,不管他原來是大寫還是小寫,將他的第5位置0,他就必將變為大寫字母;將他的第5位置1,他就必將變為小寫字母。在這個方法中,我們不需要在處理前判斷字母的大小寫。

果然,奇技淫巧...

**如下:

assume cs:code, ds:data

data segment

db 'basic'

db 'information'

data ends

code segment

start:

mov ax, data

mov ds, ax  ;設定ds指向data段

mov bx, 0   ;設定(bx)=0,ds:bx指向'basic'的第乙個字母

mov cx, 5   ;設定迴圈次數

s1:mov al, [bx]      ;將ascii碼從ds:bx所指向的單元中取出

and al, 11011111b ;將al中的ascii碼的第5位置為0,變為大寫字母

mov [bx], al      ;將轉變後的ascii碼寫回原單元

inc bx      ;(bx)加1,ds:bx指向下乙個字母

loop s1

mov bx, 5   ;設定(bx)=5,ds:bx指向'information'的第乙個字母

mov cx, 11  ;設定迴圈次數,因為'information'有11個字母

s2:mov al, [bx]

or al, 00100000b  ;將al中的ascii碼的第5位置為1,變為小寫字母

mov [bx], al

inc bx

loop s2

mov ax, 4c00h

int 21h

code ends

end start

在以後的操作中,可以從更底層的角度看看能否通過位運算來實現,效率更高,結果更精準。

基於位運算的字元大小寫轉換

我們知道,在ascii中 a z對應65 90 a z對應97 122 大小寫轉換可以通過 32進行 有一種更好的方法 基於位運算的轉換 統一轉成大寫 ch 0b11011111 簡寫 ch 0xdf 統一轉成小寫 ch 0b00100000 簡寫 ch 0x20 分析一下原理 對於與 0b1101...

C 大小寫轉換 與 位運算的 操作

c c 中可以使用 isalpha 是否為字母 isdigit 是否為數字 islower 是否小寫 isupper 是否大寫 isalnum 是否為英文或數字 同時對於字母也可以使用 tolower toupper 進行大小寫轉換 大小寫轉換 int main 最近看到乙個很有趣的轉換方式 我們可...

大小寫轉換

小寫數值轉大寫 xieshuxu 傳入轉換字串 傳入整數單位 如 元 傳入小數點後一位單位 如 角 傳入小數點後兩位單位 如 分 public string xiaotoda string xiao,string one,string two,string tree if xiao.indexof ...