JavaScriptでパリティビットを計算してバイナリに追加する方法
パリティビットとは
パリティビット(チェックビットとも呼ばれます)とは、ビット列に付加される1ビットのことで、ビット列全体に含まれる「1」の総数が偶数(偶数パリティ)または奇数(奇数パリティ)になるように調整するために使用されます。データ通信や記憶装置における誤り検出の基本的な手法として、古くから広く利用されています。
問題
ここでは、次の2つの引数を受け取るJavaScript関数を作成します。
- 希望するパリティ('even' または 'odd' のいずれか)
- チェック対象の数値を表すバイナリ文字列
関数の役割は、そのバイナリ表現に追加すべきパリティビット(0または1の整数)を返すことです。返されたビットを付加することで、ビット列全体のパリティが期待どおりになります。
コード例
以下がその実装コードです。
const parity = 'even';
const bin = '0101010';
const findParity = (parity, bin) => {
const arr = bin.toString().split("");
let countOnes = 0;
let res = 0;
for (let i = 0; i < arr.length; i++) {
if (arr[i] == 1) {
countOnes += 1;
}
};
if (parity == 'even') {
res = countOnes % 2 == 0 ? 0 : 1;
} else {
res = countOnes % 2 !== 0 ? 0 : 1;
}
return res;
};
console.log(findParity(parity, bin));
出力
1
解説
この例では、バイナリ文字列 '0101010' に含まれる「1」は3個(奇数)です。希望するパリティが 'even'(偶数)であるため、全体の「1」の個数を偶数にするには「1」を1個追加する必要があります。そのため、関数は 1 を返します。
処理の流れは次のとおりです。
- バイナリ文字列を1文字ずつ配列に分割する
- ループで「1」の個数をカウントする
- カウント結果と希望するパリティを比較し、追加すべきビット(0または1)を決定する
より簡潔な実装例
同じ処理は、配列メソッドを活用するとさらに簡潔に書くこともできます。
const findParity = (parity, bin) => {
const ones = bin.split('').filter(bit => bit === '1').length;
const isEven = ones % 2 === 0;
return parity === 'even' ? (isEven ? 0 : 1) : (isEven ? 1 : 0);
};どちらの実装でも、パリティビットの計算ロジックは同じです。用途やコードスタイルに応じて使い分けるとよいでしょう。
-
JavaScriptで2次元行列を水平方向に反転し、さらにビット反転する方法
問題0と1のみで構成される2次元のバイナリ配列 arr を唯一の引数として受け取るJavaScript関数を作成する必要があります。この関数は、まず行列を水平方向に反転(フリップ)し、その後に行列表現上の各値を反転(インバート)して、最終的な結果の行列を返すものとします。用語の定義水平方向への反転とは、行列の各行を逆順に並べ替えることを意味します。たとえば、[1, 1, 0] を水平方向に反転すると [0, 1, 1] になります。反転(インバート)とは、行列内のすべての0を1に、すべての1を0に置き換えることを意味します。たとえば、[0, 1, 1] を反転すると [1, 0, 0] になり
-
C++のSTLを使ってバイナリ配列内の1と0の個数を数える方法
このチュートリアルでは、C++のSTL(標準テンプレートライブラリ)を使用して、バイナリ配列に含まれる「1」と「0」の個数を数えるプログラムについて解説します。具体的には、0と1のみで構成された配列が与えられ、その中に「1」がいくつ、「0」がいくつ含まれているかを求めるのが目的です。実装のポイントこの問題は、STLが提供する count_if() 関数を使うことで、非常にシンプルに解決できます。count_if() は、指定した範囲内の要素のうち、条件を満たす要素の個数を返すアルゴリズムです。まず、要素が「1」であるかどうかを判定する関数を用意し、それを count_if() の第3引数として