TwitterのTLを眺めていたら、論理演算を使ったテクニックが流れて来た。
「なるほど」と思ったので、忘れないためにやってみた。
どのようなテクニックかというと、
- 大文字のアルファベット AND '_' -> 小文字化
- 小文字のアルファベット OR ' ' -> 大文字化
- 任意のアルファベット XOR ' ' -> 大文字なら小文字化, 小文字なら大文字化
といったもの。
lower_upper.c
#include <stdio.h>
#define LOWER_TO_UPPER(c) (c & '_')
#define UPPER_TO_LOWER(c) (c | ' ')
#define SWITCH_UPPER_LOWER(c) (c ^ ' ')
int main(void) {
// 大文字から小文字
printf("UPPER_TO_LOWER: %c\n", UPPER_TO_LOWER('A'));
printf("SWITCH_UPPER_LOWER: %c\n", SWITCH_UPPER_LOWER('Q'));
puts("");
// 小文字から大文字
printf("LOWER_TO_UPPER: %c\n", LOWER_TO_UPPER('a'));
printf("SWITCH_UPPER_LOWER: %c\n", SWITCH_UPPER_LOWER('q'));
return 0;
}
実行結果
UPPER_TO_LOWER: a
SWITCH_UPPER_LOWER: q
LOWER_TO_UPPER: A
SWITCH_UPPER_LOWER: Q
なるほど
(以下 2018/01/07 0:25追記)
- 注意点
- わかりやすく書くためには、'_'や' 'を使わず、2進数や16進数で書く方が良い。
- 文字数を少なくしたければ10進数を使うと良い。
- 標準ライブラリにtolower(), toupper()があること。