如何在不使用 toupper 函数的情况下将字符转换为大写
How to convert a char to uppercase without using toupper function
最近看到一段代码,将char转为小写,如果已经是小写,则保持原样。
char c = 'A';
c |= ' ';
//c -> 'a'
我正在尝试编写一个代码,可以在不使用 toupper 函数的情况下将字符转换为大写。
目前我能想到的最简单的方法就是下面的代码
char c = 'a';
c = (c | ' ') - ' ';
//c -> 'A'
所以我想知道是否有比这更直接的代码,并且可以达到相同的结果。
感谢任何帮助。
第一个代码块的快速解释
Char | ASCII Code
' ' | 13
'A' | 65
'a' | 97
和用于位操作的 or
运算符
01000001 (char 'A')
Or 00100000 (char ' ')
= 01100001 (char 'a')
----------------------
01100001 (char 'a')
Or 00100000 (char ' ')
= 01100001 (char 'a')
OR
的逆运算是AND
的补数
char c = 'a';
c &= ~' ';
解释:
01100001 (char 'a')
AND 11011111 (~ char ' ')
= 01000001 (char 'A')
一种非常直观且semi-readable的方法是使用字符减法:
#include <iostream>
char uppercase(char bla)
{
return bla -('a'-'A');
}
int main()
{
std::cout << uppercase('a') << '\n';
}
请注意,这仅适用于 a-z
,其余部分需要对某些 if
进行特殊处理。我强烈建议使用 std::toupper
或更 unicode-aware 的版本。
没有 ASCII 的更好方法是
#include <iostream>
using namespace std;
int length(char arr[])
{
int i= 0;
while(arr[i]!='[=10=]')
{
i++;
}
return i;
}
char convertCase(char a)
{
if(a>='a' && a<='z')
{
//isLowerCase
a = 'A' + (a - 'a');
}
else if(a>='A' && a<='Z')
{
//isUpperCase
a = 'a' + (a - 'A');
}
return a;
}
int main()
{
char arr[1000]={ };
cin.getline(arr,990);
int length1 = length(arr);
for(int i =0;i<length1;i++)
{
arr[i] = convertCase(arr[i]);
}
for(int i =0;i<length1;i++)
{
cout<<arr[i];
}
cout<<endl;
}
最近看到一段代码,将char转为小写,如果已经是小写,则保持原样。
char c = 'A';
c |= ' ';
//c -> 'a'
我正在尝试编写一个代码,可以在不使用 toupper 函数的情况下将字符转换为大写。
目前我能想到的最简单的方法就是下面的代码
char c = 'a';
c = (c | ' ') - ' ';
//c -> 'A'
所以我想知道是否有比这更直接的代码,并且可以达到相同的结果。
感谢任何帮助。
第一个代码块的快速解释
Char | ASCII Code
' ' | 13
'A' | 65
'a' | 97
和用于位操作的 or
运算符
01000001 (char 'A')
Or 00100000 (char ' ')
= 01100001 (char 'a')
----------------------
01100001 (char 'a')
Or 00100000 (char ' ')
= 01100001 (char 'a')
OR
的逆运算是AND
的补数
char c = 'a';
c &= ~' ';
解释:
01100001 (char 'a')
AND 11011111 (~ char ' ')
= 01000001 (char 'A')
一种非常直观且semi-readable的方法是使用字符减法:
#include <iostream>
char uppercase(char bla)
{
return bla -('a'-'A');
}
int main()
{
std::cout << uppercase('a') << '\n';
}
请注意,这仅适用于 a-z
,其余部分需要对某些 if
进行特殊处理。我强烈建议使用 std::toupper
或更 unicode-aware 的版本。
没有 ASCII 的更好方法是
#include <iostream>
using namespace std;
int length(char arr[])
{
int i= 0;
while(arr[i]!='[=10=]')
{
i++;
}
return i;
}
char convertCase(char a)
{
if(a>='a' && a<='z')
{
//isLowerCase
a = 'A' + (a - 'a');
}
else if(a>='A' && a<='Z')
{
//isUpperCase
a = 'a' + (a - 'A');
}
return a;
}
int main()
{
char arr[1000]={ };
cin.getline(arr,990);
int length1 = length(arr);
for(int i =0;i<length1;i++)
{
arr[i] = convertCase(arr[i]);
}
for(int i =0;i<length1;i++)
{
cout<<arr[i];
}
cout<<endl;
}