Задача битовых полей Объединений C++

Кто-то может убрать меня, почему я использовал бы объединение и с какой цель тот же адрес для cin'ed переменного и битового поля (задача из книги C++ Schildts)? Другими словами, почему был бы я использовать объединение для:

символ ch; байт структуры укусил;

//Отобразите код ASCII в двоичном файле для символов.

#include <iostream>
#include <conio.h>
using namespace std;

// a bit field that will be decoded
struct byte {
  unsigned a : 1;
  unsigned b : 1;
  unsigned c : 1;
  unsigned d : 1;
  unsigned e : 1;
  unsigned f : 1;
  unsigned g : 1;
  unsigned h : 1;
};

union bits {
  char ch;
  struct byte bit;
} ascii ;

void disp_bits(bits b);

int main()
{
  do {
    cin >> ascii.ch;
    cout << ": ";
    disp_bits(ascii);
  } while(ascii.ch!='q'); // quit if q typed

  return 0;
}

// Display the bit pattern for each character.
void disp_bits(bits b)
{
  if(b.bit.h) cout << "1 ";
    else cout << "0 ";
  if(b.bit.g) cout << "1 ";
    else cout << "0 ";
  if(b.bit.f) cout << "1 ";
    else cout << "0 ";
  if(b.bit.e) cout << "1 ";
    else cout << "0 ";
  if(b.bit.d) cout << "1 ";
    else cout << "0 ";
  if(b.bit.c) cout << "1 ";
    else cout << "0 ";
  if(b.bit.b) cout << "1 ";
    else cout << "0 ";
  if(b.bit.a) cout << "1 ";
    else cout << "0 ";
  cout << "\n";
}
5
задан highlevelcoder 17 June 2010 в 21:55
поделиться

4 ответа

Как объединение, оба ch и bit имеют перекрывающуюся (общую) область памяти. Если сохранить в ней символ как ch, а затем прочитать bit, то будут получены соответствующие битовые значения для этого символа.

5
ответ дан 14 December 2019 в 18:59
поделиться

Реальный ответ - вы бы не сделали. Использование битовых полей в объединениях (или вообще), как это, по своей сути непереносимо и может быть неопределенным.Если вам нужно возиться с битами, вам гораздо лучше использовать побитовые операторы C ++.

4
ответ дан 14 December 2019 в 18:59
поделиться

Объединения используются в сетевых протоколах. Они также могут быть удобны для имитации полиморфизма в C. Как правило, они представляют собой особый случай использования.

В этом примере это своего рода фиктивный пример, демонстрирующий небольшой код.

-5
ответ дан 14 December 2019 в 18:59
поделиться

Поскольку упражнение демонстрирует разбиение значения на биты с помощью битового поля и объединения.

Предполагая, что вы знаете, что такое объединение, если бы вы извлекали что-то менее повторяющееся из двоичного значения, вы могли бы использовать его для ясности, вместо того, чтобы делать, скажем, два 24-битных целых числа из 48 символов с помощью сдвигов и масок.

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

void disp_bits(unsigned b)
{ // not tested
    for ( int shift = 7; shift >= 0;  --shift )
        cout <<  ( ( b >> shift ) & 1 ) << ' ';

    cout << "\n";
}
1
ответ дан 14 December 2019 в 18:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: