获取最后n位二进制

Rez*_*dan 1 c++

我正在研究一个项目,我需要的是获取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; 怎么了 ?

Bas*_*tch 5

尝试

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.

你的术语是错的,数字不是一点,或者你应该说一个二进制数字


The*_*ign 5

演示版

要读取/选择特定位置的位,您必须隐藏或掩盖其余位。实现此目的的一种方法是按位与:&运算符(不是逻辑与,&&)。假设我们正在谈论的是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位的掩码的步骤:

  1. 将所有位设置为1。可以通过将零取反来完成:~0-> 1111 1111(255个十进制,FF十六进制)
  2. n向左移动位:~0 << n。如果n为2,您将得到1111 1100
  3. 取反结果:~(~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操纵器的内容。然而,如果数字转换为可以被显示bitsetcout << 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)