JavaScriptで2つの数値が少なくとも2つの共通する1ビットを持っているか確認する方法
問題
JavaScriptで、2つの数値を引数として受け取る関数を作成する必要があります。この関数は、両方の数値の2進数表現において、同じ桁位置に「1」が2箇所以上共通して存在する場合には true を返し、そうでない場合は false を返します。
たとえば、10 の2進数表現は 1010、15 の2進数表現は 1111 です。これらを右端から比較すると、1ビット目と3ビット目の2箇所で「1」が一致しているため、結果は true になります。
コード例
以下がその実装コードです。
const num1 = 10;
const num2 = 15;
const checkBits = (num1 = 1, num2 = 1) => {
let c = num1.toString(2).split('');
let d = num2.toString(2).split('');
if(c.length > d.length){
c = c.slice(c.length - d.length);
}else{
d = d.slice(d.length - c.length);
};
let count = 0;
for(let i = 0; i < d.length; i++){
if(c[i] === "1" && d[i] === "1"){
count++;
};
};
return count > 1;
};
console.log(checkBits(num1, num2));出力結果
上記のコードを実行すると、コンソールに以下の出力が表示されます。
true
コードの解説
このコードの動作を順番に見ていきましょう。
ステップ1:2進数への変換toString(2) メソッドを使って各数値を2進数の文字列に変換し、さらに split('') で1文字ずつの配列に分割します。
ステップ2:桁数の調整
2つの配列の長さが異なる場合、slice() を使って短い方の長さに合わせます。これにより、下位のビット同士が正しく対応した状態で比較できるようになります。
ステップ3:共通ビットのカウント
ループ処理で各桁を順に比較し、両方の数値で「1」となっている位置をカウントします。
ステップ4:判定
最後に、共通する「1」の個数が2以上であれば true を、それ以外の場合は false を返します。
このアプローチにより、シンプルな文字列操作とループ処理だけで、2つの数値が共通の1ビットをいくつ持っているかを簡単に判定できます。
-
JavaScriptでインスタンス間のプライベートメンバーを共有・操作する方法をわかりやすく解説
JavaScriptでは、コンストラクタ関数内でletやconstを使って変数を宣言すると、その変数は外部から直接アクセスできない「プライベートメンバー」となります。このプライベートな値には、関数内で定義された特権メソッド(クロージャ)を通じてのみアクセスできます。 以下は、Personコンストラクタでプライベートメンバーを持つ複数のインスタンスを作成し、それぞれの値を取得するサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <m
-
JavaScriptでプロトタイプを使ってメソッドを共有する方法
JavaScriptにおけるメソッドの共有JavaScriptでは、メソッドをオブジェクト(コンストラクタ関数)のprototypeプロパティに定義することで、複数のインスタンス間でそのメソッドを共有できます。通常、コンストラクタ内でthis.displayInfo = function(){...}のようにメソッドを定義すると、生成されるインスタンスごとに関数のコピーが作成され、メモリを無駄に消費します。一方、prototypeに定義すれば、関数は一度だけ生成され、すべてのインスタンスから参照・呼び出しできるようになります。これはメモリ効率の面でも大きなメリットがあります。以下は、JavaS