使用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内核就是这样一种环境. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |