2017-02-12 1 views
0

J'ai un vector<int> de longueur n qui contient seulement 0 et 1. Par exemple, nous pouvons avoir le vecteur suivant la longueur 10:Int de la représentation des octets dans le vecteur C++

0 1 1 0 1 0 0 1 0 0 

J'utilise maintenant le nombre représenté par ce vecteur pour accéder à un emplacement dans un tableau avec 2^n entrées (dans ce cas un array de 2^10 = 1024). Je ne suis pas sûr comment je peux obtenir un nombre entier de la représentation d'octet stockée dans ce vector<int>.

+4

Qu'en est-il de std :: bitset au lieu de vector? –

Répondre

2

Il suffit de lancer à travers le vecteur et de recueillir des pouvoirs 2.

Cela dépend fin du vecteur que vous voulez que chiffre le plus significatif, mais par exemple

auto to_int(const vector<int>& digits) 
    -> int 
{ 
    int result = 0; 
    for(int const digit : digits) 
    { 
     result += 2*result + digit; 
    } 
    return result; 
} 

Ou l'autre manière,

auto to_int(const vector<int>& digits) 
    -> int 
{ 
    int result = 0; 
    for(int i = (int)digits.size(); i --> 0;) 
    { 
     result += 2*result + digits[i]; 
    } 
    return result; 
} 

Avertissement: le code, non appuyés par le compilateur.

+0

Y a-t-il une raison de préférer 'auto -> int' au type de retour simple' int'? – luk32

+0

Beaucoup. Lisez-le dessus. :) –

+0

Peut-être que cela ferait une question inerestante. Je ne me considère pas comme un ignorant, mais je n'ai pas vu un tel usage quand le type est explicite. Oh, et le grand opérateur '->'. Je commence à penser que vous aimez obscurcir la syntaxe = P – luk32

0

Une simple utilisation manière une boucle for:

size_t val{0}; 
for (const auto i : vec) 
    val = (val << 1) + i; 
+0

Vous vouliez probablement dire << << ', pas' <'. C'est généralement une bonne idée de laisser cette optimisation au compilateur, en écrivant juste '2 *'. ;-) –

+0

Bien repéré, merci. Puisque nous construisons un octet à partir d'un modèle binaire, je trouve le changement plus lisible. –

0

Quelque chose comme ceci:

int integer=0; 
int c=0; 
for(int i : intVector){ 
    integer+=i<<c; 
    c++; 
} 
return integer; 
0

Vous pouvez garder le std::vector et utiliser std::bitset:

#include <iostream> 
#include <vector> 
#include <bitset> 
#include <algorithm> 
#include <climits> 

template <typename IterType> 
unsigned long getValue(IterType i1, IterType i2) 
{ 
    unsigned long i = 0; 
    std::bitset<CHAR_BIT * sizeof(unsigned long)> b; 
    std::for_each(i1, i2, [&](auto n) { b.set(i++, n);}); 
    return b.to_ulong(); 
} 

int main() 
{ 
    std::vector<int> v = {0, 1, 1, 0, 1, 0, 0, 1, 0, 0}; 
    auto val = getValue(v.rbegin(), v.rend()); 
    std::cout << val << "\n";; 
    auto val2 = getValue(v.begin(), v.end()); 
    std::cout << val2; 
} 

Notez que selon quel bit est le bit le plus significatif, vous fournissez les itérateurs acco remently. De droite à gauche, alimentez les itérateurs inversés, sinon fournissez des itérateurs vers l'avant.

Live Example