如何检查" long long int"在C ++中

时间:2015-04-20 16:38:23

标签: 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";

二进制等价物23355665641326是 -

101010011110111101010001001110110111101101110
            ^

我们看到,第32位被设置。但我的代码返回未设置:(
我该怎么检查一下?

3 个答案:

答案 0 :(得分:5)

如果您改用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[]则不执行,在这种情况下,无效索引会导致未定义的行为。

答案 1 :(得分:4)

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

在处理long long int时,您需要使用long long type 1
因为如果您使用普通1(int),则可以查看31 bit 所以只需更改检查部分 -

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

答案 2 :(得分:1)

要克服需要在检查中添加后缀,只需执行以下操作:

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