我正在研究一个项目,我需要的是获取n二进制文件的最后几位.我尝试了一些东西,但是我工作得不好.这是代码:
long long int to_bin(int n)
{
long long int Fin=0,pow=1;
while(n)
{
Fin=Fin+(n%2)*pow;
n/=2;pow*=10;
}
return Fin;
} // returns binary
int get_last_n_digits(int nr , int n_dig)
{
int l_digits =0 , power = 1;
for(int i = 0 ; i < n_dig ; i++)
power *=10;
l_digits = nr%power;
return l_digits;
} //returns last digits of a number
Run Code Online (Sandbox Code Playgroud)
例如,我需要245的二进制表示的最后2位,即这样的东西:
get_last_n_digits(to_bin(254,S) ;
Run Code Online (Sandbox Code Playgroud)
结果是:4; 怎么了 ?
尝试
static inline long get_last_n_bits(long num, int nbbits) {
return num & ((1L<<nbbits)-1);
}
Run Code Online (Sandbox Code Playgroud)
并阅读有关二进制表示和按位运算的更多信息; 你甚至可以使num正式的模板参数类型...然后使用get_last_n_bits<long>或get_last_n_bits<uint64_t>等.
然后测试get_last_n_bits(245,2)是1.
你的术语是错的,数字不是一点,或者你应该说一个二进制数字
要读取/选择特定位置的位,您必须隐藏或掩盖其余位。实现此目的的一种方法是按位与:&运算符(不是逻辑与,&&)。假设我们正在谈论的是8位数字,如果输入为15,掩码为7,则结果为7:
Input: decimal 15 as binary: 0000 1111 &
Mask: decimal 7 as binary: 0000 0111
------------------------------------------
Output: decimal 7 as binary: 0000 0111
Run Code Online (Sandbox Code Playgroud)
您的问题实际上是找到合适的口罩。如果要求您提供最后4位,则掩码应为0000 1111(十进制15,六进制F)。如果要求您输入最后两位数字,则掩码应为0000 0011(三进制十进制,三十六进制)。查找最后n位的掩码的步骤:
~0-> 1111 1111(255个十进制,FF十六进制)n向左移动位:~0 << n。如果n为2,您将得到1111 1100~(~0 << n)。如果n为2,您将得到0000 0011。有了遮罩后,您所要做的就是使用按位与:
output = input & ~(~0 << n)
Run Code Online (Sandbox Code Playgroud)
这是最终的结果:
unsigned get_last_n_bits( unsigned u, int n )
{
return u & ~(~0U << n);
}
Run Code Online (Sandbox Code Playgroud)
使用标准流操纵器无法以二进制为基础显示结果。您不能编写类似于cout << hex << number:没有bin操纵器的内容。然而,如果数字转换为可以被显示bitset:cout << bitset< width >( number ):
#include <iostream>
#include <bitset>
using namespace std;
unsigned get_last_n_bits( unsigned u, int n )
{
return u & ~(~0U << n);
}
int main()
{
cout << bitset<8>( get_last_n_bits( 254, 2 ) ); // displays 00000010
return 0;
}
Run Code Online (Sandbox Code Playgroud)