使用位操作符转换为大写

  • 本文关键字:转换 操作符 位操作
  • 更新时间 :
  • 英文 :


嗨,我有一个将字符转换为大写的函数,但是不理解这行代码*src & = ~0x20

下面是完整的代码

void upper_case(char *src)
{
    while (*src != '')
    {
        if (islower(*src))
          *src &= ~0x20;
        src++;
    }
}

谢谢

这是一个ASCII解决方案,从小写字符的整数值减去32,等于它的大写。

它并不适用于所有字符集/编码。如果您的环境/区域设置是"C"区域设置或"En_US",则此操作将有效,否则可能无法工作,因为并非每个字符集都有小写和大写之间的0x20(32)关系,也没有大写或小写的概念。

对于这个问题,即使使用ASCII, islower()也不是一个安全的检查(我看到Ray Chen刚刚在评论中指出),由于重音字符和其他问题。我将使用
if(ch >= 'a' && ch <= 'z')   // this == islower() in "C" locale, but not others

限制该集合以避免重音字符。Islower()不保证-32会将其大写。

在任何情况下,它都是"旧的方式",可悲的是,它已经成为许多其他"简单"的技巧和假设的方式,比如。txt表示ASCII。

在http://blogs.msdn.com/b/oldnewthing/archive/2007/04/17/2158334.aspx上查看有趣的阅读

小写字符的取值范围为0x61 ~ 0x7a。大写字符的范围是0x41到0x5a,正好小于0x20。

所以你有两个选择:你可以减去0x20,或者你可以清除0x20位,它所做的是:~0x20是0x20的补充(即0xbf),如果你and它,它会删除那个位。

最新更新