C++のビット演算を使ってアルファベットの文字位置を求める方法
この記事では、英字で構成された文字列 str が与えられたとき、ビット演算を使って各文字がアルファベットの何番目に位置するかを求める方法を解説します。
問題の概要
文字列内の各文字について、英語アルファベットにおける位置(1〜26)を出力します。文字の大小は区別せず、「t」と「T」は同じ文字として扱います。
入出力例
入力: str = "Tutorialspoint"
出力: 20 21 20 15 18 9 1 12 19 16 15 9 14 20
解法のアプローチ
文字の位置を求める最もシンプルな方法は、各文字と31の論理積(AND)を取ることです。
ASCIIコードでは「A」が65、「a」が97であり、どちらも下位5ビットが1〜26の値に対応しています。31は2進数で「11111」と表されるため、文字コードと31のAND演算を行えば、大文字・小文字に関係なくアルファベット上の位置(1〜26)が一括して得られます。
C++での実装例
#include <iostream>
using namespace std;
void findLetterPosition(string str, int n) {
for (int i = 0; i < n; i++) {
cout<<(str[i] & 31) << " ";
}
}
int main() {
string str = "TutorialsPoint";
int n = str.length();
cout<<"The letters position in string "<<str<<" is \n";
findLetterPosition(str, n);
return 0;
}実行結果
The letters position in string TutorialsPoint is 20 21 20 15 18 9 1 12 19 16 15 9 14 20
まとめ
ビット演算を活用することで、条件分岐や変換テーブルを使わずに、効率的かつ簡潔にアルファベットの文字位置を取得できます。特に「& 31」というマスク処理は、大文字と小文字のコード差(32 = 2の5乗)を吸収できる巧妙な手法なので、覚えておくとさまざまな場面で役立ちます。
-
C++で文字列の部分文字列の総数を求める方法を解説
この記事では、与えられた文字列から作成できる空でない部分文字列の個数を求める方法について解説します。入力 : string = "moon" 出力 : 10 説明 : 部分文字列は m、o、o、n、mo、oo、on、moo、oon、moon の 10 個です。 入力 : string = "yellow" 出力 : 21解法のアプローチ文字列の長さを n とします。上の例からも分かるように、考えられるすべての部分文字列の個数を求めるには、長さ n、(n-1)、(n-2)、(n-3)、……2、1 の部分文字列の個数を順に加算していく必要があります。部分文
-
C++で括弧文字列からイコールポイント(等分点)を見つける方法
この記事では、C++を使って括弧の文字列からイコールポイント(等分点)を求める方法を解説します。 イコールポイントとは? イコールポイントとは、あるインデックス i において、その位置より前にある開き括弧「(」の数と、その位置以降にある閉じ括弧「)」の数が等しくなる地点のことです。 例として、次の括弧文字列を考えてみましょう。 (()))( ()()() )) ) → 元の文字列は (()))(()()()))) この文字列を詳しく観察すると、インデックス0〜9の範囲に含まれる開き括弧は5個、インデックス9〜14の範囲に含まれる閉じ括弧も5個あります。したがって、インデックス9がこの文字列の