2017-02-15 4 views
4

У нас есть один символ Chr на входе. Выходной сигнал должен иметь строчный регистр Chr, если Chr имеет верхний регистр и наоборот.C++, наиболее эффективный способ изменения верхнего и нижнего регистров и наоборот без ветвления состояния

Trivial реализации с использованием if else заявление:

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

Не могли бы вы предложить решение без каких-либо условий ветвления?

Нечто вроде Chr + 32*(<sign of>(Chr - 'a'))?

Обновление: Я задал ASCII, когда задал этот вопрос.

ответ

9

Если ваши символы используют набор символов ASCII, вы можете xor со значением 32, чтобы перевернуть между верхним и нижним регистром.

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

В ASCII действительно вы можете, и это умный способ сделать это. (Если вы упомянули это ограничение, я думаю, что это получит много upvotes.) – Bathsheba

+0

Это работает, только если ввод является алфавитным символом, но не для пунктуации, цифр и т. Д. Но если это действительно так, то это здорово. – mars

+2

A (41): 0100,0001 против (61): 0110,0001. Таким образом, бит 5 (32) является коммутатором. ASCII так красив. –

4

Возможно, вам будет сложно избить ::tolower, так как это будет очень оптимизировано для вашей платформы.

Но если вы хотите handcode это самостоятельно, а затем сохранить массив arr размера 256 (на основе вокруг unsigned char) таким образом, что

arr[n] является строчной формой n.

Это O (1) без ветвления и будет переносимым, если вы установите массив, используя 'a', 'b', & c.

+1

На самом деле ветвления и массив на основе оба O (1), хотя в зависимости от оптимизации компилятора, где кодированной помещаются (петли?) И состояние кэша, решение массива может быть немного медленнее из-за ошибки кэша, в то время как ветвление может быть оптимизировано, например, с использованием ответвления ветвления. Как правило, рекомендуется тестировать все решения и проецировать их, чтобы увидеть, какая из них лучше всего подходит для вас. – cbuchart

+2

@cbuchart: Абсолютно! Вот почему мое первое предложение, вероятно, победит. – Bathsheba