#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. Да, спасибо! вот что я хотел сказать.