给定一个字符串,编写一个函数,使用位运算运算符&(AND),|(OR),〜(NOT)将其从小写转换为大写或从大写转换为小写,然后返回字符串。
我们中的许多人都知道按位操作比对编译器执行算术运算要快,因为数据以二进制形式存储为0和1。
例子:
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.从小写到大写
此方法通过按位与(&)加上小数点(〜)为32的方式将小写字母的ASCII值简单地从ASCII值中减去32,从而将字母转换为大写。
// C++ program to convert a string from
// lower to upper case.
#include
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;
}
输出:
SANJAYKANNA
2.大写到小写
类似地,它通过按位或(|)将32的值添加到大写字母的ASCII值中,其中32将字母转换为小写。
// C++ program to convert a string from
// upper to lower case.
#include
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;
}
输出:
sanjaykanna
解释:
ASCII表的构造方式使得小写字母的二进制表示形式与大写字母的二进制表示形式几乎相同。
字符’A’是整数65 =(0100 0001)2,而字符’a’是整数97 =(0110 0001)2。
ASCII值“ a”和“ A”之间的差为32。
因此,我们可以使用如上所示的按位运算运算符,通过从字母中增加或减去差来轻松地将字母的大小写从上到下或从下到上。
锻炼:
实现一个更改字符串大小写的函数,以使GeeksFoRgeekS变成gEEKSfOrGEEKs。