我尝试做的任务已经过了截止日期,所以你没有做我的作业。
为了学习,我想知道如何做一些事情。
我能够创建一个程序,使用按位运算符的掩码以二进制打印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");
}
我需要:
我是C ++的新手,我的老师甚至不会看我的代码,请有人解释,并尽量保持基本。谢谢!
答案 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(), '_' );
内循环