gpt4 book ai didi

c - linux 中的 toupper 和 tolower 函数使用 XOR 按位运算

转载 作者:IT王子 更新时间:2023-10-29 01:15:38 28 4
gpt4 key购买 nike

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 (^) 按位运算如下所示吗?

异或运算有没有潜在的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');
}

几乎编译成同样的东西,当然是模加法与异或法:

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, %rbp
movl %edi, -4(%rbp)
movl -4(%rbp), %eax
xorl $32, %eax
popq %rbp
ret

addlxorl 指令都是三个字节,所以没有区别。我假设它们在当今最有趣的 CPU 上都是单周期的。

请注意,正如我在评论中所说,一般而言,您不应该四处走动并假设您的 C 程序在可以做出此类假设的环境中运行。然而,Linux 内核就是这样一个环境。

关于c - linux 中的 toupper 和 tolower 函数使用 XOR 按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40995040/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com