Как просмотреть битовое представление короткого замыкания?

Если у меня есть это как указатель на память как указатель на шорты:

unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);

и я знаю размер мс (количество этих шорт), я хотел бы видеть прогон всех этих шорт и их бинарное представление.

Как я могу получить доступ к битам каждого короткого замыкания на С++?


person Safari    schedule 15.11.2011    source источник


Ответы (5)


cout << "\t" << dec << x << "\t\t Decimal" << endl;
cout << "\t" << oct << x << "\t\t Octal" << endl;
cout << "\t" << hex << x << "\t\t Hex" << endl;
cout << "\t" << bitset<MAX_BITS>(x) << endl;

попробуй через битсет

РЕДАКТИРОВАТЬ (добавлен код)

#include <iostream>
#include <bitset>
using namespace std;

int main( int argc, char* argv[] )
{
  unsigned short _memory[] = {0x1000,0x0010,0x0001};
  unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);
  for(unsigned short* iter = ms; iter != ms + 3/*number_of_shorts*/; ++iter )
  {
    bitset<16> bits(*iter);
    cout << bits << endl;
    for(size_t i = 0; i<16; i++)
    {
      cout << "Bit[" << i << "]=" << bits[i] << endl;
    }
    cout << endl;
  }
}

or

#include <iostream>
#include <algorithm>
#include <bitset>
#include <iterator>

int main( int argc, char* argv[] )
{
    unsigned short _memory[] = {0x1000,0x0010,0x0001};
    unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);
    unsigned int num_of_ushorts = 3;//

    std::copy(ms, ms+num_of_ushorts, ostream_iterator<bitset<16>>(cout, " "));
}
person neagoegab    schedule 15.11.2011
comment
как я могу преобразовать свой набор битов‹16› бит (*iter) в короткие ms[i]? - person Safari; 17.11.2011

Чтобы увидеть двоичное представление любой переменной типа T, вы можете сделать что-то вроде этого:

template <typename T>
void print_raw(const T & x)
{
  const unsigned char * const p = reinterpret_cast<const unsigned char *>(&x);
  for (std::size_t i = 0; i != sizeof(T); ++i)
  {
    if (i != 0) std::putchar(' ');
    std::printf("%02X", p[i]);
  }
}

Вы можете включить это в свой список шорт.

(Вы даже можете заменить printf двумя поисками индекса p[i] / 16 и p[i] % 16 в подходящем алфавите:

static const char alphabet = "01234567890ABCDEF";
std::putchar(alphabet[p[i] / 16]);
std::putchar(alphabet[p[i] % 16]);

Или замените его подлинным бинарным принтером:

void print_byte(unsigned char b)
{
  for (std::size_t i = CHAR_BIT; i != 0; --i)
  {
    std::putchar(b & (1u << (i-1)) ? '1' : '0');
  }
}

Вы можете связать это с предыдущим циклом вместо двух вызовов printf.)

person Kerrek SB    schedule 15.11.2011
comment
+1, но крошечная гнида: i должен быть типа std::size_t, а не unsigned. - person ildjarn; 16.11.2011
comment
у меня ошибка на putc: Ошибка 1 ошибка C2660: 'putc': функция не принимает 1 аргумент - person Safari; 16.11.2011
comment
1) Я хотел бы видеть биты представления вкратце, например: 0001000100101011 этот код не делает этого. 2) как мне поступить, если я хочу изменить один из этих битов с 1 на 0? - person Safari; 16.11.2011
comment
@Gg: Легко: 0001 = 1, 0010 = 2, ..., 1111 = F. putc должно было быть putchar, извиняюсь. @ildjarn: Что мы не делаем во имя педантизма :-) - person Kerrek SB; 16.11.2011
comment
Добавлен двоичный код печати! Полагаю, лично я бы предпочел справочную таблицу, но, по крайней мере, эта не делает никаких предположений о количестве битов в байте. - person Kerrek SB; 16.11.2011
comment
Разве CHAR_BIT не макрос? std::CHAR_BIT имеет смысл? - person ildjarn; 16.11.2011
comment
@ildjarn: я думал, что это просто где-то константа. Я хотел избежать того, чтобы какой-то педант или кто-то еще приставал ко мне, мве, это должно быть std:: :-) Я понял это неправильно? - person Kerrek SB; 16.11.2011
comment
Ха-ха, вы никогда не сможете угодить некоторым людям. :-P §18.3.3/2 говорит, что CHAR_BIT действительно является макросом. - person ildjarn; 16.11.2011
comment
@ildjarn: Грмф. Есть ли шанс, что std::CHAR_BIT все еще имеет смысл? Если нет, то мне придется редактировать снова... - person Kerrek SB; 16.11.2011
comment
Не думайте так - это будет расширяться, например. std::8. - person ildjarn; 16.11.2011

for (size_t i=0; i<N_SHORTS_IN_BUFFER; i++)
    // perform bitwise ops

где N_SHORTS_IN_BUFFER — количество шорт в memory.

Количество битов в short равно CHAR_BIT * sizeof(short).

person Fred Foo    schedule 15.11.2011

Если вы работаете в предположении, что unsigned short имеет 16 бит, вы можете получить каждый из них с помощью побитовых операций:

for( unsigned short* iter = ms; iter != ms + num_of_ushorts; ++iter )
{
    int bitN = ( *iter ) & ( 1 << N ); // get the N bit
}
person K-ballo    schedule 15.11.2011

Поскольку _memory указывает на список шорт, ваш указатель ms можно использовать как массив.

unsigned short* ms = reinterpret_cast<unsigned short*>(_memory);

for (int i = 0; i < NUM_SHORTS_IN_MEM; i++)
    cout << i << "th element\t" << ms[i] << endl;
person Kashyap    schedule 15.11.2011