2017-02-15 15 views
4

入力時に単一文字Chrがあります。 Chrが大文字の場合、出力はChrの小文字にする必要があります。条件分岐なしで大文字を小文字に変換する最も効率的な方法

if(Chr>='a' && Chr<='z') cout<<(unsigned char)(a-32); 
else cout<<(unsigned char)(a+32); 

は、あなたが任意の条件分岐せずにソリューションを提案でした:if elseステートメントを使用して

簡易実現?

何かのようにChr + 32*(<sign of>(Chr - 'a'))

更新:この質問の際に私はASCIIを念頭に置いていました。

答えて

9

文字がASCII文字セットを使用している場合は、値32で大文字と小文字を切り替えることができます。

char switchCase(char letter) 
{ 
    return letter^32; 
} 
+0

実際にはASCIIでこれを行うことができますし、賢明な方法です。 (この制限について言えば、これはたくさんのアップフォースが得られると思う) – Bathsheba

+0

これは入力がアルファベットの文字で、句読点、数字などではない場合にのみ機能します。 – mars

+2

A(41):01000001対a(61):0110,0001。したがって、ビット5(32)がスイッチです。 ASCIIはとても美しいです。 –

4

::tolowerはプラットフォームに合わせて最適化されているため、たぶん難しいでしょう。

しかし、あなたはそれを自分でhandcodeしたい場合は、その後、

arr[n]nの下部ケースの形になるように(unsigned char周りベース)サイズ256の配列arrを維持します。

これは分岐なしのO(1)であり、'a''b'、&cを使用して配列を設定した場合、ポータブルになります。

+1

は実際に分岐し、アレイベースの両方のO(1)、符号化が配置されているコンパイラの最適化、(ループ?)、キャッシュ状態にもよるが、アレイ溶液は、わずかに遅いによるキャッシュ障害にあってもよいしています分岐は例えば分岐予測を用いて最適化することができる。通常は推奨されているので、すべてのソリューションをテストし、どのソリューションが最適かを確認します。 – cbuchart

+2

@cbuchart:絶対に!だから私の最初の文がおそらく勝つのです。 – Bathsheba

関連する問題