Je me suis un peu coincé avec mon algorithme et j'ai besoin d'aide pour résoudre mon problème. Je pense qu'un exemple expliquerait mieux mon problème.C++: calculer le complément d'un nombre et son nombre de discordances possibles
En supposant que:
- d = 4 (nombre maximal de bits autorisés dans un certain nombre, 2^4-1 = 15).
- m_max = 1 (nombre maximal de mésappariements de bits autorisés).
- kappa = (nombre maximal d'éléments à trouver pour une donnée d et m, où m dans m_max)
L'idée principale est pour un nombre donné, x, pour calculer le numéro de complément (en base binaire) et toutes les combinaisons possibles jusqu'à m_max mismatches de x nombre de complément.
Maintenant, le programme pour numériser de i = 0 à 15.
pour i = 0 et m = 0, kappa = \ binom {d} {0} = 1 (appelé un parfait match) combinaisons possibles en bits, est seulement 1111 (pour 0: 0000).
pour i = 0 et m = 1, kappa = \ binom {d} {1} = 4 (une non-concordance) combinaisons possibles de bits sont: 1000, 0100, 0010 et 0001
Mon problème était de généraliser à général d et m. J'ai écrit le code suivant:
#include <stdlib.h>
#include <iomanip>
#include <boost/math/special_functions/binomial.hpp>
#include <iostream>
#include <stdint.h>
#include <vector>
namespace vec {
typedef std::vector<unsigned int> uint_1d_vec_t;
}
int main(int argc, char* argv[]) {
int counter, d, m;
unsigned num_combination, bits_mask, bit_mask, max_num_mismatch;
uint_1d_vec_t kappa;
d = 4;
m = 2;
bits_mask = 2^num_bits - 1;
for (unsigned i = 0 ; i < num_elemets ; i++) {
counter = 0;
for (unsigned m = 0 ; m < max_num_mismatch ; m++) {
// maximum number of allowed combinations
num_combination = boost::math::binomial_coefficient<double>(static_cast<unsigned>(d), static_cast<unsigned>(m));
kappa.push_back(num_combination);
for (unsigned j = 0 ; j < kappa.at(m) ; j++) {
if (m == 0)
v[i][counter++] = i^bits_mask; // M_0
else {
bit_mask = 1 << (num_bits - j);
v[i][counter++] = v[i][0]^bits_mask
}
}
}
}
return 0;
}
Je suis coincé dans la ligne v[i][counter++] = v[i][0]^bits_mask
depuis que je suis incapable de généraliser mon algorithme à m_max> 1, depuis que je avais besoin pour inadéquations m_max m_max boucles et dans mon problème d'origine, m est inconnu jusqu'à l'exécution.
donc ce que vous voulez est, compte tenu de deux séquences de bits, pour les comparer et compter le nombre de bits qui sont différents entre eux? Il est généralement beaucoup plus facile de lire une question si vous suivez une courte description informelle de ce que vous essayez de * faire *. alors votre algorithme précis, les noms de variable et le code exact peuvent venir plus tard, quand nous avons un contexte pour cela, et savoir ce que c'est supposé signifier *. – jalf
@jalf - est-ce le cas? Si c'est le cas, c'est beaucoup plus facile à faire que la solution. –
@Eagle - vous semblez utiliser le caret ('^') comme un opérateur d'exponentiation. Caret en C et C++ représente une opération XOR bit à bit. –