微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用XOR按位运算在linux中使用toupper和tolower函数

Linux Source代码

tolower和topupper的实现如下实现

static inline unsigned char __tolower(unsigned char c)
{
        if (isupper(c))
            c -= 'A'-'a';
        return c;
}


 static inline unsigned char __toupper(unsigned char c)
 {
    if (islower(c))
            c -= 'a'-'A';
    return c;
 }

我可以使用XOR(^)按位运算,如下所示.

如果我使用xor操作,是否有任何潜在的Bug?

c -= 'A'-'a'; ----> c = c ^ 0x20 ;  //using xor to convert to lower case to upper case and vice versa

解决方法

你很可能,但很难看出这一点.

异或:使用常量输入字节值并不比添加(或减去)常量快.并且它变成切换的好处(即toupper()和tolower()可以是相同的代码)非常小,因为代码量太小.

拆卸时,这两个功能

int my_tolower1(int c)
{
  return c + 'a' - 'A';
}

int my_tolower2(int c)
{
  return c ^ ('a' - 'A');
}

几乎编译成相同的东西,模数当然add vs xor:

my_tolower1(int):
        pushq   %rbp
        movq    %rsp,%rbp
        movl    %edi,-4(%rbp)
        movl    -4(%rbp),%eax
        addl    $32,%eax
        popq    %rbp
        ret
my_tolower2(int):
        pushq   %rbp
        movq    %rsp,%eax
        xorl    $32,%eax
        popq    %rbp
        ret

addl和xorl指令都是三个字节,所以没有区别.我认为这些天他们在大多数有趣的cpu上都是单周期的.

请注意,正如我在评论中所说的那样,一般来说,你不应该绕过并假设你的C程序在你可以做出这些假设的环境中运行.然而,Linux内核就是这样一种环境.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐