我试图检查长整数的特定位
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位被设置。但我的代码返回未设置:(
我该怎么检查一下?
答案 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";