如何在 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[]
则不会,在这种情况下无效索引会导致未定义的行为。
我正在尝试检查一个 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[]
则不会,在这种情况下无效索引会导致未定义的行为。