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)
看起来毫无意义,如果用户已经打开文件执行 3
(11
二进制)。
你怎么看?
mode
字段未被视为位掩码,并且 modes
类型未定义 2 的幂的值。因此您不应该对 [=22= 使用按位运算] mode
,正是由于这个原因,EXECUTE
与 READ
和 WRITE
共享位,这违背了您希望每个模式独立的愿望。在适当的位掩码中,EXECUTE
将被定义为 4
(100
二进制),而不是 3
.
我有这个来自 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)
看起来毫无意义,如果用户已经打开文件执行 3
(11
二进制)。
你怎么看?
mode
字段未被视为位掩码,并且 modes
类型未定义 2 的幂的值。因此您不应该对 [=22= 使用按位运算] mode
,正是由于这个原因,EXECUTE
与 READ
和 WRITE
共享位,这违背了您希望每个模式独立的愿望。在适当的位掩码中,EXECUTE
将被定义为 4
(100
二进制),而不是 3
.