如何在不使用toupper函数的情况下将char转换为大写

时间:2015-12-30 12:52:21

标签: c++ bit-manipulation uppercase lowercase

最近我看到了一段将char转换为小写的代码,如果它已经是小写,它就会保持不变。

char c = 'A';
c |= ' ';
//c -> 'a'

我试图编写一个代码,可以在不使用toupper函数的情况下将char转换为大写。

目前我能想到的最简单的方法是下面的代码。

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')

3 个答案:

答案 0 :(得分:9)

OR的反向操作是AND和补充。

char c = 'a';
c &= ~' ';

DEMO

说明:

    01100001 (char 'a')
AND 11011111 (~ char ' ')
  = 01000001 (char 'A')

答案 1 :(得分:1)

非常直观且半可读的方法是使用字符减法:

<强> Live on coliru

#include <iostream>

char uppercase(char bla)
{
    return bla -('a'-'A');
}

int main()
{
  std::cout << uppercase('a') << '\n';
}

请注意,这仅适用于a-z,其余部分需要特殊处理if。我强烈建议使用std::toupper或更多unicode感知版本。

答案 2 :(得分:0)

没有ASCII的更好的方法是

#include <iostream>
using namespace std;
int length(char arr[])
{
    int i= 0;
    while(arr[i]!='\0')
    {
        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;
}