在
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 举报,一经查实,本站将立刻删除。