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

How to check a particular bit of a "long long int" in C++

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

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";

23355665641326 的二进制等价物是 -

101010011110111101010001001110110111101101110
            ^

我们看到,第 32 位已设置。但是我的代码 returns 没有设置 :(
我怎样才能检查位?

您可以使用1LL<<bit_no查看long long int的位状态。

在处理 long long int 时,您需要使用 long long type 1
因为如果你使用普通的1(int),你最多可以检查31 bit
所以只需像这样更改检查部分 -

if( (val & (1LL<<bit_no) ) == 0)
            ^^^

要克服在支票中添加后缀的需要,只需执行如下操作:

if(!!((val >> bit_no) & 1))
    std::cout << "not set";
else
    std::cout << "is set";

如果您改用 std::bitset,您的生活会很轻松:

constexpr auto N = CHAR_BIT * sizeof(long long int);

std::bitset<N> val(23355665641326LL);

现在您可以测试特定位:

if ( val.test(i) ) {
      //bit at index i is set!
}

或者您可以使用速度更快但不安全的版本,如:

if ( val[i] ) {
      //bit at index i is set!
}

test() 执行绑定检查并在索引无效时抛出 std::out_of_range,而 operator[] 则不会,在这种情况下无效索引会导致未定义的行为。