s [i] ^ = 32如何将大小写转换为小写?

Ras*_*ami 8 c++ string lowercase uppercase

int main()
{
    string s;
    cout << "enter the string :" << endl;
    cin >> s;
    for (int i = 0; i < s.length(); i++)
        s[i] ^= 32;
    cout << "modified string is : " << s << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我看到这个代码在stackoverflow上将大写转换为小写.

但我不明白这条线s[i] = s[i]^32.

它是如何工作的?

ala*_*ain 20

^=独占或赋值运算符.32是二进制的100000,因此^= 32切换目标中的第五位.在ASCII中,小写和大写字母相隔32个位置,因此这会将低位大写转换为大写形式,也可以转换为另一种方式.

但它仅适用于ASCII,不适用于Unicode,仅适用于字母.要编写可移植的C++,您不应该将字符编码假定为ASCII,因此请不要使用此类代码.@πάνταῥεῖs答案显示了一种正确的方法.

  • 永远不要使用这样的代码. (3认同)
  • @ magic-sudo:除了az和AZ之外还有很多ASCII字符. (2认同)

πάν*_*ῥεῖ 16

它是如何工作的?

让我们看看ASCII值'A':

'A' 是二进制的 1000001

XORed with 32(二进制100000)

产生任何未设置高位字符指示位的值:

1000001ASCII中的 XOR 100000 = 1100001== 'a'.


任何理智和可移植的c或c ++应用程序都应该使用tolower():

int main()
{
    string s;
    cout<<"enter the string :"<<endl;
    cin>>s;
    for (int i=0;i<s.length();i++) s[i] = tolower( (unsigned char)s[i] );
                                     // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    cout<<"modified string is : "<<s<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

s[i]=s[i]^32(货物邪教)魔法,依赖于ASCII表具体映射的数字char值.

还有其他char代码表,例如EBCDIC ,其中

 s[i]=s[i]^32
Run Code Online (Sandbox Code Playgroud)

方法很难找回相应的小写字母.


有一个更复杂的c ++版本转换为小写字符显示在参考文档页面中std::ctype::tolower().


Gov*_*mar 5

在C++中,与其前身C一样,a char是数字类型.这毕竟是如何在硬件上表示字符,这些语言不会隐藏这些字符.

在ASCII中,字母具有有用的属性,即大写和小写字母之间的差异是单个二进制位:第5位(如果我们从0开始从右开始编号).

大写字母A由字节0b01000001(0x41十六进制)表示,小写字母a由字节0b01100001(0x61十六进制)表示.请注意,大写和小写A之间的唯一区别是第五位.这种模式从B到Z继续.

因此,当你^= 32在一个代表ASCII字符的数字上(顺便说一下,是2到5次方)时,它做的是切换第5位 - 如果它是0,它变为1,反之亦然,这会改变从大写到小写的字符,反之亦然.