3 回答
TA贡献1943条经验 获得超7个赞
我会使用一个移位运算符:
const int has_nukes = 1<<0;
const int has_bio_weapons = 1<<1;
const int has_chem_weapons = 1<<2;
// ...
int dangerous_mask = has_nukes | has_bio_weapons | has_chem_weapons;
bool is_dangerous = (country->flags & dangerous_mask) == dangerous_mask;
它甚至比泛滥的0更好。
TA贡献2037条经验 获得超6个赞
在C ++ 14中,您将能够使用具有以下语法的二进制文字:
0b010101010 /* more zeros and ones */
此功能已在最新版本clang和中实现gcc。如果使用options运行那些编译器,则可以尝试一下-std=c++1y。
TA贡献1815条经验 获得超6个赞
顺便说一下,下一个C ++版本将支持用户定义的文字。它们已经包含在工作草案中。这允许出现这种情况(希望我没有太多错误):
template<char... digits>
constexpr int operator "" _b() {
return conv2bin<digits...>::value;
}
int main() {
int const v = 110110110_b;
}
conv2bin 将是这样的模板:
template<char... digits>
struct conv2bin;
template<char high, char... digits>
struct conv2bin<high, digits...> {
static_assert(high == '0' || high == '1', "no bin num!");
static int const value = (high - '0') * (1 << sizeof...(digits)) +
conv2bin<digits...>::value;
};
template<char high>
struct conv2bin<high> {
static_assert(high == '0' || high == '1', "no bin num!");
static int const value = (high - '0');
};
好吧,由于上面的“ constexpr”,我们得到的是在编译时已经完全评估过的二进制文字。上面使用了硬编码的int返回类型。我认为甚至可以使它取决于二进制字符串的长度。它对任何有兴趣的人使用以下功能:
广义常数表达式。
可变参数模板。可以在这里找到简要介绍
静态断言(static_assert)
用户定义的文字
实际上,当前的GCC干线已经实现了可变参数模板和静态断言。我们希望它将很快支持其他两个。我认为C ++ 1x会摇摇欲坠。
- 3 回答
- 0 关注
- 564 浏览
添加回答
举报