C++ primer 第 5 版 ch 19 Bitfieds

C++ primer 5th edition ch 19 Bitfieds

我有这个来自 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 &open(modes);
     void close();
     void write();
     bool isRead() const;
     void setWrite();C++ Primer, Fifth Edition
 };

 File &File::open(File::modes m)
 {
     mode |= READ;    // set the READ bit by default
     // other processing
     if (m & 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 & 2 = 2 3 & 1 = 1 ,我认为这是一个错误。通常每个模式都独立于任何其他模式。

我的意思是,比如在成员函数open()中,mode |= READ设置读取位就可以了,也就是第一个。现在 if(m & WRITE) 看起来毫无意义,如果用户已经打开文件执行 311 二进制)。

你怎么看?

mode 字段未被视为位掩码,并且 modes 类型未定义 2 的幂的值。因此您不应该对 [=22= 使用按位运算] mode,正是由于这个原因,EXECUTEREADWRITE 共享位,这违背了您希望每个模式独立的愿望。在适当的位掩码中,EXECUTE 将被定义为 4100 二进制),而不是 3.