加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 01:07:16 所属栏目:Linux 来源:网络整理
导读:在 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'; r
在 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内核就是这样一种环境.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读