s[i]^=32如何将大写转换为小写?
How does s[i]^=32 convert upper to lower case?
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;
}
我看到这段代码在stackoverflow上将大写转换为小写。
但是我不明白s[i] = s[i]^32
这句话。
它是如何工作的?
^=
是异或赋值操作符。32在二进制中是100000,所以^= 32
交换目的地的第5位。在ASCII中,小写字母和大写字母相隔32个位置,所以这将小写字母转换为大写字母,也可以反过来转换。
但是它只适用于ASCII,例如不适用Unicode,并且只适用于字母。为了编写可移植的c++,你不应该假设字符编码是ASCII,所以请不要使用这样的代码。
它是如何工作的?
让我们看看ASCII值'A'
:
'A'
是二进制1000001
xoror with 32 (binary 100000
)
产生任何值,如果上面的字符表示位没有设置:
1000001
XOR100000
= 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;
}
s[i]=s[i]^32
(货物崇拜)魔法,依赖于ASCII表特定映射到数字char
值。
还有其他char
代码表,例如EBCDIC,其中
s[i]=s[i]^32
方法无法检索到相应的小写字母。
在std::ctype::tolower()
的参考文档页面中有一个更复杂的c++版本,可以将其转换为小写字符。
在c++中,像它的前身C一样,char
是一个数字类型。毕竟,这是字符在硬件上的表示方式,这些语言不会向您隐藏这一点。
在ASCII中,字母有一个有用的属性,大写字母和小写字母之间的区别是一个二进制位:第5位(如果我们从0开始从右开始编号)。
大写A由字节0b01000001
(十六进制的0x41
)表示,小写A由字节0b01100001
(十六进制的0x61
)表示。注意,大写字母A和小写字母A之间的唯一区别是第5位。此模式从B延续到z
因此,当您对表示ASCII字符的数字执行^= 32
(顺便说一下,它是2的5次方)时,它所做的是切换第5位-如果它是0,则变为1,反之亦然,这将字符从大写变为小写,反之亦然。
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++