Conversión de mayúsculas y minúsculas (de menor a mayor y viceversa) de una string mediante operadores BitWise en C/C++

Dada una string, escriba una función que la convierta de minúsculas a mayúsculas o de mayúsculas a minúsculas usando los operadores bit a bit &(AND), |(OR), ~(NOT) en su lugar y devuelva la string. Muchos de nosotros sabemos que las manipulaciones bit a bit son más rápidas que realizar operaciones aritméticas para un compilador, ya que los datos se almacenan en forma binaria de 0 y 1. Ejemplos:

Input : "LowerToUpPer"
Output : "LOWERTOUPPER"
   Letters already in the uppercase remains the same. 
   while rest get converted to uppercase.

Input : "UPPerTOloweR"
Output : "uppertolower"
   Letters already in the lowercase remains the same.
   while rest get converted to lowercase.

1.De minúsculas a minúsculas Este método simplemente resta un valor de 32 del valor ASCII de la letra minúscula mediante AND bit a bit (&) con negación (~) de 32 convirtiendo la letra a mayúscula. 

Implementación:

CPP

// C++ program to convert a string from
// lower to upper case.
#include<stdio.h>
 
const int x = 32;
 
// Converts a string to uppercase
char *toUpperCase(char *a)
{
    for (int i=0; a[i]!='\0'; i++)
        a[i] = a[i] & ~x;
 
    return a;
}
 
// Driver Code
int main()
{
    char str[] = "SanjaYKannA";
 
    //Here it's recommended to use character array
    //as it's stored in read-write area.
    //If a pointer is used it's stored
    //in read-only memory as a string literal.
 
    printf("%s", toUpperCase(str));
 
    return 0;
}
Producción

SANJAYKANNA

Complejidad temporal : O(n) 
Espacio auxiliar : O(1

2. Mayúsculas a minúsculas De manera similar, agrega un valor de 32 al valor ASCII de la letra mayúscula mediante ORing bit a bit (|) con 32 convirtiendo la letra a minúscula. 

Implementación:

CPP

// C++ program to convert a string from
// upper to lower case.
#include<stdio.h>
const int x = 32;
 
// Converts a string to lowercase
char * toLowerCase(char *a)
{
    for (int i=0; a[i]!='\0'; i++)
        a[i] = a[i] | x;
 
    return a;
}
 
// Driver Code
int main()
{
    char str[] = "SanjaYKannA";
    printf("%s", toLowerCase(str));
    return 0;
}
Producción

sanjaykanna

Complejidad temporal : O(n) 
Espacio auxiliar : O(1) 

Explicación: La tabla ASCII está construida de tal manera que la representación binaria de letras minúsculas es casi idéntica a la representación binaria de letras mayúsculas. El carácter ‘A’ es el número entero 65 = (0100 0001)2, mientras que el carácter ‘a’ es el número entero 97 = (0110 0001)2. La diferencia entre los valores ASCII de ‘a’ y ‘A’ es 32. Por lo tanto, podemos cambiar fácilmente el caso de las letras de Superior a inferior o de inferior a superior sumando o restando la diferencia de las letras usando operadores bit a bit como se muestra arriba. 

Ejercicio: implemente una función que cambie el caso de una string de modo que GeeksFoRgeekS se convierta en gEEKSforGEEKs.   

Este artículo es una contribución de Sanjay Kumar Ulsha de JNTUH College Of Engineering, Hyderabad . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *