位操作-使用逐位生成二进制数(C++)

bit manipulation - Using Bitwise to make Binary numbers (C++)

本文关键字:二进制数 C++ 位操作      更新时间:2023-10-16

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

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

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

我使用的掩码的问题是,它还会打印出32个前导零,后面跟着二进制数字(例如,00000000000000000000000000000000001代表数字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++的新手,我的老师甚至不会看我的代码,请有人解释,并尽量保持它的基础。非常感谢。

这里有一个想法,使用一个标志来表示前导零位。如果位为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;
  }
}

如果从右到左扫描,则会更容易,因为您不需要删除前导零,只需在数字为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(), '_' );

内部环路