Быстрое преобразование uint32_t в двоичный файл

Основная проблема, с которой я сталкиваюсь, заключается в считывании значений в двоичном виде в C ++ (в python было несколько действительно быстрых / простых функций для этого)

Мне просто нужно то же самое. Итак, на данный момент у меня есть:

ValWord< uint32_t> data1=//[SOME READ FUNCTION]

Когда я использую cout << data1; Это дает мне номер, например 2147581953

Я хочу, чтобы это было в двоичном виде, и в конечном итоге каждый «бит» должен быть в своем собственном бине, включая все 0, например:

for (int i = 31; i >= 0; i--) {
cout << binary[i];
}

Дал бы мне это 32-битное двоичное число. Когда у меня было это как прямая инт, я использовал:

    int data[32];
bitset<32>(N) = data1;

for(int i=31; i >=0; i--) {
data[i]=(bitset<32>(N[i]).to_ulong());
}

for (int i = 31; i >= 0; i--) {
cout << data[i];
}

Но это просто дает мне сообщения об ошибках. Есть идеи?

0

Решение

Может быть, это:

#define CPlusPlus11 0

#if CPlusPlus11
int main()
{
std::uint32_t value(42);
std::bitset<32> bits(value);
std::cout << bits.to_string() << std::endl;
// Storing integral values in the string:
for(auto i: bits.to_string(char(0), char(1))) {
std::cout << (int)i;
}
std::cout << std::endl;
return 0;
}
#else
int main()
{
std::uint32_t value(42);
std::bitset<32> bits(value);
std::cout << bits.to_string() << std::endl;
char data[32];
for(unsigned i = 0; i < 32; ++i) {
data[i] = bits[i];
}
for(unsigned i = 32; i; --i) {
std::cout << int(data[i-1]);
}
std::cout << std::endl;
return 0;
}
#endif

Примечание: ваши выражения bitset<32>(N) = data1 а также bitset<32>(N[i]) код запах.

2

Другие решения

В общем, преобразование числа в строку для заданной базы довольно распространено:

#include <cassert>
#include <string>

static char const Digits[] = "0123456789abcdefghijklmnopqrstuvwxyz";
static size_t const DigitsSize = sizeof(Digits) - 1;

static size_t const BufferSize = 32;

std::string convert(unsigned number, unsigned base) {
assert(base >= 2 and base <= DigitsSize);

char buffer[BufferSize] = {};
char* p = buffer + BufferSize;

while (number != 0) {
*(--p) = Digits[number % base];
number /= base;
}

return std::string(p, (buffer + BufferSize) - p);
}

Замечания: BufferSize было вычислено для минимального основания 2, основание 1 и основание 0 не являются бессмысленными.

Примечание: если число может быть отрицательным, проще всего проверить его заранее, а затем использовать его противоположное; Особое предостережение заключается в том, что противоположное минимальному значению 32-разрядного целого числа не может быть представлено 32-разрядным целым числом в базе 2.

1

У меня есть несколько простых функций, которые я использую для этого, используя stl, вот одна для двоичного кода:

#include <iostream>
#include <algorithm>

using namespace std;

string binary( unsigned long n )
{
string result;

do result.push_back( '0' + (n & 1) );
while (n >>= 1);

reverse( result.begin(), result.end() );
return result;
}

int main()
{
cout << binary(1024) << endl;
cout << "Hello World" << endl;

return 0;
}

Надеюсь, что это полезно для вас!

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

0
По вопросам рекламы [email protected]