C++,最有效的方法是将大写更改为小写,反之亦然,无需条件分支

Ala*_*kov 4 c++ ascii

我们Chr在输入上有单个字符.输出必须小写,Chr如果Chr是大写,反之亦然.

使用if else声明的琐碎实现:

if(Chr>='a' && Chr<='z') cout<<(unsigned char)(a-32);
else cout<<(unsigned char)(a+32);
Run Code Online (Sandbox Code Playgroud)

你能提出没有任何条件分支的解决方案吗?

有点像Chr + 32*(<sign of>(Chr - 'a'))

更新:当被问到这个问题时,我记住了ASCII.

Col*_*lin 8

如果您的字符使用的是ASCII字符集,则可以使用值32进行xor在大写和小写之间翻转.

char switchCase(char letter)
{
    return letter ^ 32;
}
Run Code Online (Sandbox Code Playgroud)

  • A(41):0100,0001 vs a(61):0110,0001.所以第5位(32)是开关.ASCII太漂亮了. (2认同)
  • @Chenot你可能会喜欢[ascii.pdf](http://www.trafficways.org/ascii/ascii.pdf) (2认同)

Bat*_*eba 5

您可能会发现它很难被击败,::tolower因为它将针对您的平台进行高度优化。

但如果您想自己手动编码,则维护一个arr大小为 256 的数组(基于unsigned char),这样

arr[n]是 的小写形式n

这是 O(1),没有分支,并且如果您使用'a', 'b', &c 设置数组,那么它将是可移植的。

  • @cbuchart:当然!这就是为什么我的第一句话可能会获胜。 (2认同)