Changing ASCII case using bitwise operator
I am writing this post to share the method with my friends. I am doing Bachelor in Computer Science and Engineering. My microprocessor course teacher gave us a task to change case from upper or lower to uppercase. It is kind of "DO it yourself" task. I am using emu 8086 for this task. Here are two test cases that we have must pass: Teas Case 1: Input : abcd Output : ABCD Teas Case 2: Input : aBCd Output : ABCD NOTE: Input will be always 4 character and between a-z or A-Z. We can solve it using conditional instruction. To make the problem more interesting, I've challenged myself to solve it without branching. Gladly, I've found a way to solve it using bitwise operator. Character ASCII value (binary) A 0 1 0 0 0 0 0 1 a 0 1 1 0 0 0 0 1 We can see that the 6th bit is zero for uppercase character and one for lowercase character. If we can set the bit to 0 no matter what is the input, the character will become Uppercase. We can set it to zero and left rest of bits unchanged by using bitwise AND operation. a -> 0110 0001 1101 1111 ---------------- AND -> 0100 0001 I am going to use 11011111 (binary) or DF (hex) to set the 6th bit to zero and leave other bits unchanged. PROC MAIN MOV AH, 01H ; input mode INT 21H ; take 1st character in AL AND AL, 0DFH ; perform AND operation MOV BL, AL ; Move result to another Register INT 21H ; same as 1st character AND AL, 0DFH MOV BH, AL INT 21H ; same as 1st character AND AL, 0DFH MOV CL, AL INT 21H ; same as 1st character AND AL, 0DFH MOV CH, AL MOV AH, 02H MOV DL, 0AH ; print newline INT 21H MOV DL, 0DH ; print cret INT 21H MOV DL, BL ; print 1st character INT 21H MOV DL, BH ; print 2nd character INT 21H MOV DL, CL ; print 3rd character INT 21H MOV DL, CH ; print 4th character INT 21H ENDP Case 1 : Case 2 : Happy Coding !!!

I am writing this post to share the method with my friends.
I am doing Bachelor in Computer Science and Engineering. My microprocessor course teacher gave us a task to change case from upper or lower to uppercase.
It is kind of "DO it yourself" task.
I am using emu 8086 for this task.
Here are two test cases that we have must pass:
Teas Case 1:
Input : abcd
Output : ABCDTeas Case 2:
Input : aBCd
Output : ABCD
NOTE: Input will be always 4 character and between a-z or A-Z.
We can solve it using conditional instruction.
To make the problem more interesting, I've challenged myself to solve it without branching.
Gladly, I've found a way to solve it using bitwise operator.
Character | ASCII value (binary) |
---|---|
A | 0 1 0 0 0 0 0 1 |
a | 0 1 1 0 0 0 0 1 |
We can see that the 6th bit is zero for uppercase character and one for lowercase character.
If we can set the bit to 0 no matter what is the input, the character will become Uppercase.
We can set it to zero and left rest of bits unchanged by using bitwise AND operation.
a -> 0110 0001
1101 1111
----------------
AND -> 0100 0001
I am going to use 11011111 (binary) or DF (hex) to set the 6th bit to zero and leave other bits unchanged.
PROC MAIN
MOV AH, 01H ; input mode
INT 21H ; take 1st character in AL
AND AL, 0DFH ; perform AND operation
MOV BL, AL ; Move result to another Register
INT 21H ; same as 1st character
AND AL, 0DFH
MOV BH, AL
INT 21H ; same as 1st character
AND AL, 0DFH
MOV CL, AL
INT 21H ; same as 1st character
AND AL, 0DFH
MOV CH, AL
MOV AH, 02H
MOV DL, 0AH ; print newline
INT 21H
MOV DL, 0DH ; print cret
INT 21H
MOV DL, BL ; print 1st character
INT 21H
MOV DL, BH ; print 2nd character
INT 21H
MOV DL, CL ; print 3rd character
INT 21H
MOV DL, CH ; print 4th character
INT 21H
ENDP
Case 1 :
Case 2 :
Happy Coding !!!