我正在尝试检查一个长整数的特定位
long long int val=23355665641326;
int bit_no=32;
if( (val & (1<<bit_no)) == 0)
cout<<bit_no<<"'th bit is not set\n";
else
cout<<bit_no<<"'th bit is set\n";
Run Code Online (Sandbox Code Playgroud)
等价的二进制23355665641326是 -
101010011110111101010001001110110111101101110
^
Run Code Online (Sandbox Code Playgroud)
我们看到,第32位被设定.但我的代码返回没有设置:(
我怎么能检查位?
如果您改用,您的生活将变得轻松std::bitset:
constexpr auto N = CHAR_BIT * sizeof(long long int);
std::bitset<N> val(23355665641326LL);
Run Code Online (Sandbox Code Playgroud)
现在您可以测试特定位:
if ( val.test(i) ) {
//bit at index i is set!
}
Run Code Online (Sandbox Code Playgroud)
或者您可以使用更快但不安全的版本,如:
if ( val[i] ) {
//bit at index i is set!
}
Run Code Online (Sandbox Code Playgroud)
test()std::out_of_range如果索引无效,则执行绑定检查和抛出,而operator[]不是,在这种情况下,无效索引会导致未定义的行为.