Não estou trabalhando a nivel binário.Mas esse é um dos casos onde o uso da matemática é elementar e transforma o código em branchless.
O código é básicamente na forma:
Código PHP:
def swap_char_case(char):
char = ord(char)
if char >= 97 and char <= 121:
return chr(char-32)
if char >= 65 and char <= 90:
return chr(char+32)
return chr(char)
def swap_string_case(string):
ret = ''
for char in string:
ret += swap_char_case(char)
return ret
Mas o uso de ifs é desnecessário e torna o código mais lento em swap_char_case então:
Código PHP:
def swap_char_case(char):
char = ord(char)
#Inverte o sinal da expressão quando necessário
#2*int(char >= 97)-1
#True: 2*1-1 = 1
#False: 2*0-1 = -1
#Ou seja,vai somar 32 quando for menor que 97 e subtrair 32 quando maior.
#Zera a expressão se o caracter não estiver na range de caracteres que queremos mudar o case (a-z,A-Z).
#Por uma questão de legibilidade a colocamos por ultimo
#(char >= 97 and char <= 121) or (char >= 65 and char <= 91)
return chr(char-1*(2*int(char >= 97)-1)*32*((char >= 97 and char <= 121) or (char >= 65 and char <= 91)))
O que é equivalente a função acima só que sem estruturas condicionais.Pra manter o código "pequeno" e por preguiça eu tinha trocado:
Código PHP:
((char >= 97 and char <= 121) or (char >= 65 and char <= 91))
Por básicamente:
Código PHP:
valid_char_range = range(97,122)+range(65,92)
//...
(char in valid_char_range)
O que é bem mais lento mas alcançou meu objetivo.
De forma que o código escrito da "melhor forma" em uma das possiveis notações fica:
Código PHP:
def swap_char_case(char):
char = ord(char)
return chr(char-1*(2*int(char >= 97)-1)*32*((char >= 97 and char <= 121) or (char >= 65 and char <= 91)))
swap_string_case = lambda string : ''.join(map(swap_char_case, string))
strings = ['~~SmIlEy FaCe~~', 'JoAo', ' --- ', 'ABCde']
print 'Exemplo:'
print '--', '\n-- '.join(map(swap_string_case, strings))
#Saida
"""
Exemplo:
-- ~~sMiLeY fAcE~~
-- jOaO
-- ---
-- abcDE
"""