ios::fmtflags 在 C++ 中如何工作?setf() 如何工作?
How does ios::fmtflags works in C++?How setf() works?
我正在尝试了解 ios 流的格式化标志。谁能解释一下这个 cout.setf(ios::hex | ios::showbase)
是如何工作的?我的意思是 or (|
) 运算符如何在两个 ios 格式的标志之间工作?
请原谅我糟糕的英语。
std::ios_base::hex
和 std::ios_base::showbase
都是 BitmaskType std::ios_base::fmtflags
的枚举数。 BitmaskType 通常是枚举类型,其枚举数是两个不同的幂,有点像这样:(1 << n
表示 2n)
// simplified; can also be implemented with integral types, std::bitset, etc.
enum fmtflags : unsigned {
dec = 1 << 0, // 1
oct = 1 << 1, // 2
hex = 1 << 2, // 4
// ...
showbase = 1 << 9, // 512
// ...
};
|
运算符是位或运算符,对相应的位进行或运算,所以
hex 0000 0000 0000 0100
showbase 0000 0010 0000 0000
-------------------
hex | showbase 0000 0010 0000 0100
此技术可用于将标志组合在一起,因此位掩码中的每一位都代表一个单独的标志(设置或未设置)。然后,每个标志可以是
查询到:mask & flag
;
设置:mask | flag
;
未设置:mask & (~flag)
.
我正在尝试了解 ios 流的格式化标志。谁能解释一下这个 cout.setf(ios::hex | ios::showbase)
是如何工作的?我的意思是 or (|
) 运算符如何在两个 ios 格式的标志之间工作?
请原谅我糟糕的英语。
std::ios_base::hex
和 std::ios_base::showbase
都是 BitmaskType std::ios_base::fmtflags
的枚举数。 BitmaskType 通常是枚举类型,其枚举数是两个不同的幂,有点像这样:(1 << n
表示 2n)
// simplified; can also be implemented with integral types, std::bitset, etc.
enum fmtflags : unsigned {
dec = 1 << 0, // 1
oct = 1 << 1, // 2
hex = 1 << 2, // 4
// ...
showbase = 1 << 9, // 512
// ...
};
|
运算符是位或运算符,对相应的位进行或运算,所以
hex 0000 0000 0000 0100
showbase 0000 0010 0000 0000
-------------------
hex | showbase 0000 0010 0000 0100
此技术可用于将标志组合在一起,因此位掩码中的每一位都代表一个单独的标志(设置或未设置)。然后,每个标志可以是
查询到:
mask & flag
;设置:
mask | flag
;未设置:
mask & (~flag)
.