0

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

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

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

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

这就是我所拥有的

    # 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 个数字后添加下划线

我是 C++ 新手,我的老师甚至不会看我的代码,请有人解释一下,并尽量保持基本。谢谢!

4

2 回答 2

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;
  }
}
于 2013-02-26T16:56:05.093 回答
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;
}

要更改最小宽度,您需要稍微修改循环条件,添加 unsercore 可以很简单:

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

内循环

于 2013-02-26T17:55:38.853 回答