如何在C++中检查"long long int"的特定位

1 c++ bit-manipulation

我正在尝试检查一个长整数的特定位

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位被设定.但我的代码返回没有设置:(
我怎么能检查位?

Naw*_*waz 5

如果您改用,您的生活将变得轻松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[]不是,在这种情况下,无效索引会导致未定义的行为.

  • 在C++中唯一正确的方法是使用std :: bitset. (3认同)