C primer 5-е издание ch 19 Bitfieds

#c #bit-fields

Вопрос:

У меня есть этот пример из C primer 5-го издания. битные поля ch-19:

  typedef unsigned int Bit;
 class File {
     Bit mode: 2;       // mode has 2 bits
     Bit modified: 1;   // modified has 1 bit
     Bit prot_owner: 3; // prot_owner has 3 bits
     Bit prot_group: 3; // prot_group has 3 bits
     Bit prot_world: 3; // prot_world has 3 bits
     // operations and data members of File
 public:
     // file modes specified as octal literals; see § 2.1.3 (p. 38)
     enum modes { READ = 01, WRITE = 02, EXECUTE = 03 };
     File amp;open(modes);
     void close();
     void write();
     bool isRead() const;
     void setWrite();C   Primer, Fifth Edition
 };

 File amp;File::open(File::modes m)
 {
     mode |= READ;    // set the READ bit by default
     // other processing
     if (m amp; WRITE) // if opening READ and WRITE
     // processing to open the file in read/write mode
     return *this;
 }
 

Что заставляет меня задуматься mode , так это то, что элемент является справедливым 2 bits , поэтому он может содержать значения: 0, 1, 2, 3 ( 00 01 10 11 в двоичном формате). Значение 3 определяется как перечисление , которое указывает режим открытия как execute , но если оно открыто здесь для выполнения, то оно также открыто для записи: 3 amp; 2 = 2 3 amp; 1 = 1 , что я считаю ошибкой. Обычно каждый режим независим от любого другого режима.

Я имею в виду, например, в функции open() -члене mode |= READ можно установить бит чтения , который является первым. Теперь if(m amp; WRITE) это выглядит бессмысленным, если пользователь уже открыл файл для выполнения 3 ( 11 в двоичном формате).

А ты как думаешь?

Комментарии:

1. перечисление необязательно является битовым полем. Это может быть указание операции, а не разрешений.

Ответ №1:

mode Поле не рассматривается как битовая маска, и modes тип не определяет значения в степенях 2. Таким образом , вы не должны использовать побитовые операции для установки/запроса mode , именно по этой причине, которая EXECUTE разделяет биты с READ и WRITE , что противоречит вашему желанию, чтобы каждый режим был независимым. В правильной битовой EXECUTE маске будет определено как 4 ( 100 в двоичном формате), а не 3 .

Комментарии:

1. Да, спасибо! вот что я хотел сказать.