2017-02-12 4 views
0

У меня есть vector<int> длины n, которая содержит только 0 и 1. Например, мы можем иметь следующий вектор длины 10:Int от представления байтов в векторе C++

0 1 1 0 1 0 0 1 0 0 

Теперь я использую число, представленное этим вектором, чтобы получить доступ место в массиве с 2^п записей (так в данном случае массив из 2^10 = 1024). Я не уверен, как получить одно целое из байтового представления, хранящегося в этом vector<int>.

+4

Как насчет std :: bitset вместо вектора? –

ответ

2

Просто пробежать вектор и собирать силы 2.

Это зависит от того, какого конца вектора вы хотите, как наиболее значимая цифра, но, например,

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

Или другой способ,

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; 
} 

Отказ от ответственности: код не рассматривается компилятором.

+0

Есть ли причина предпочесть 'auto -> int' над открытым типом' int' return? – luk32

+0

Многие. Прочитайте это. :) –

+0

Возможно, это вызовет неудобный вопрос. Я не считаю себя невежественным, но я не видел такого использования, когда тип явно. О, и великий оператор '->'. Я начинаю думать, что вам нравится обфускать синтаксис = P – luk32

0

просто способом, используя for цикл:

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

Вероятно, вы имели в виду '<<', а не '<'. Как правило, рекомендуется оставить эту оптимизацию компилятору, просто написав '2 *'. ;-) –

+0

Хорошо заметили, спасибо. Поскольку мы создаем байт из битовой диаграммы, я считаю, что сдвиг более читабельным. –

0

Что-то вроде этого:

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

Вы можете держать std::vector и использовать 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; 
} 

Обратите внимание, что в зависимости от который бит является самым значительным бит, вы поставляете итераторы acco rdingly. Для справа налево поставьте обратные итераторы, в противном случае поставьте вперед итераторы.

Live Example

Смежные вопросы