使用Bitwise制作二进制数(C ++)

时间:2013-02-26 16:37:43

标签: c++ bit-manipulation mask

我尝试做的任务已经过了截止日期,所以你没有做我的作业。

为了学习,我想知道如何做一些事情。

我能够创建一个程序,使用按位运算符的掩码以二进制打印1-32。

我使用的掩码问题是它还会打印出32个前导零,然后是二进制数(例如,对于数字1,例如0000000000000000000000000000000001)

这就是我所拥有的

    # include <iostream>
    #include <string>
    using namespace std; 

    string naiveBitToChar( int num ) 
    {

string st;
unsigned mask = 0x80000000;

if( num == 0 )
{
    return "0";
}

while( ( num & mask ) )
    mask >>= 1;
do 
{
    if ( num & mask ) 
    {
        st = st + "1";
    } 
        else 
        {
            st = st + "0";
        }

    mask >>= 1;
}
while( mask );


return st;
    }


    int main ( int argc, char* argv[] ) {

argc; argv;

    for( int i = 0; i < 32; i++ )
        cout << naiveBitToChar(i) << "\n";
    system ("pause");
    }

我需要:

  1. 从字符串中删除前导零
  2. 在每个字符串中添加最少8个数字(例如00000010)
  3. 使用分隔符掩码(例如0000_1000)在每第4个数字后添加下划线
  4. 我是C ++的新手,我的老师甚至不会看我的代码,请有人解释,并尽量保持基本。谢谢!

2 个答案:

答案 0 :(得分:1)

这是一个想法,使用一个标志来指示一个前导的零数字。如果该位是1,则更改标志。仅当数字不是前导零时才打印数字。

bool is_leading_zero = true;
while (/*... */)
{
  // Convert bit to character in st
  if (st == '1')
  {
    is_leading_zero = false;
  }
  if (!is_leading_zero)
  {
    cout << st;
  }
}

答案 1 :(得分:0)

如果你从右向左扫描,那么它会更容易,因为你不需要删除前导零,只是在数字为0时停止:

std::string binary( unsigned n )
{
    std::string bits;
    for( unsigned mask = 1; true; mask <<=1 ) {
        bits.insert( bits.begin(), n & mask ? '1' : '0' );
        n &= ~mask;
        if( !n ) break;
    }
    return bits;
}

甚至更简单:

std::string binary( unsigned n )
{
    std::string bits;
    do {
        bits.insert( bits.begin(), n & 1 ? '1' : '0' );
        n >>= 1;
    } while( n );
    return bits;
}

要改变最小值,你需要稍微修改循环条件,添加unserscore可以这么简单:

if( bits.length() % 4 ) bits.insert( bits.begin(), '_' );

内循环