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 關注
- 608 瀏覽
添加回答
舉報