C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で2つの数値の交互ビットを組み合わせて新しい数値を生成する方法

この問題では、2つの数値の交互のビットを使って新しい数値を生成します。具体的には、2番目の数値から1番目のビットを、1番目の数値から2番目のビットを、再び2番目の数値から3番目のビットを、1番目の数値から4番目のビットを…というように、LSB(最下位ビット)側から順に交互にビットを取り出していきます。

まず、例を使って問題をより深く理解しましょう。

入力 : n = 6, m = 10
出力 : 2
説明 :
6 のビット表現  = 0110
10 のビット表現 = 1010

0 1 1 0   (n = 6)
  ^   ^     ← この位置のビットを採用
1 0 1 0   (m = 10)
^   ^       ← この位置のビットを採用

結果 = 0 0 1 0 = 2

この例から分かるように、解法のポイントは、2番目の数値のLSBから開始して、2つの数値から交互にビットを取得することです。

この問題を解くための実現可能なアプローチの一つは、次のとおりです。まず1番目の数値 n の偶数番目の位置にあるセットビットを抽出し、次に2番目の数値 m の奇数番目の位置にあるセットビットを抽出し、最後にその2つのビットごとのOR(論理和)を計算して結果とします。

アルゴリズム

ステップ1 : n の偶数番目の位置のセットビットの値を求めます。
ステップ2 : m の奇数番目の位置のセットビットの値を求めます。
ステップ3 : result =(n の偶数番目セットビット)|(m の奇数番目セットビット)を計算します。
ステップ4 : result の値を出力します。

実装例(C++)

#include <iostream>
using namespace std;
int setevenbits(int n) ;
int setoddbits(int m) ;
int main(){
    int n = 12;
    int m = 17;
    int setn = setevenbits(n);
    int setm = setoddbits(m);
    int result = ( setn | setm );
    cout<<result;
    return 0;
}
int setevenbits(int n){
    int temp = n;
    int count = 0;
    int res = 0;
    for (temp = n; temp > 0; temp >>= 1) {
        if (count % 2 == 1)
            res |= (1 << count);
        count++;
    }
    return (n & res);
}
int setoddbits(int m){
    int count = 0;
    int res = 0;
    for (int temp = m; temp > 0; temp >>= 1) {
        if (count % 2 == 0)
            res |= (1 << count);
        count++;
    }
    return (m & res);
}

出力

25

コードの解説

setevenbits関数は、数値 n を1ビットずつ右シフトしながら各ビット位置を走査し、偶数番目の位置(2番目、4番目、6番目…)に対応するマスク res を作成します。その後、元の数値 n とこのマスクのAND(論理積)を取ることで、偶数番目の位置にあるビットのみを抽出します。

setoddbits関数も同様の仕組みで、奇数番目の位置(1番目、3番目、5番目…)に対応するマスクを作成し、数値 m とのANDを取ることで奇数番目の位置のビットを抽出します。

最後に、main関数内でこれら2つの結果をビットごとのORで結合することで、2つの数値から交互にビットを取った新しい数値が得られます。上記の例では、n = 12(1100)と m = 17(10001)から生成される結果は 25(11001) となります。

  1. C++でデューデニー数(Dudeney Number)を判定する方法

    デューデニー数とは? デューデニー数(Dudeney Number)とは、数論で定義される特殊な自然数の一つです。「ある自然数が、別の自然数の完全立方数に等しく、かつ元の数の各桁の数字和が、その立方根となる数の桁和と一致する」とき、その数をデューデニー数と呼びます(Wikipediaより)。 この数は、イギリスの著名なパズル作家であるヘンリー・デューデニー(Henry Dudeney)によって発見されました。数学的には次の式で表されます。 有名な例としては 512 = 8³ が挙げられます。512 の桁和は 5 + 1 + 2 = 8 となり、立方根である 8 と一致するため、512 はデ

  2. C++のCHAR_BITとは?意味と使い方を解説

    CHAR_BITは、char型が持つビット数を表すマクロです。C++では「limits.h」ヘッダーファイル(C++では<climits>)で宣言されており、一般的な環境では1バイトが8ビットであることを示します。このマクロを利用することで、移植性の高いコードを書くことができます。環境に依存せずにchar型のビット数を取得できるため、ビット演算やデータサイズの計算に役立ちます。CHAR_BITの使用例以下は、C++でCHAR_BITを使用したサンプルコードです。CHAR_BITとsizeofを組み合わせてint型の全ビット数を求め、整数値を2進数形式で出力しています。#includ