битовая манипуляция — Использование побитового кода для создания двоичных чисел (C ++)

Задание, которое я пытался выполнить, истекло, поэтому вы не выполняете мою домашнюю работу.

Ради обучения я хотел бы знать, как сделать несколько вещей.

Я был в состоянии сделать программу с маской, используя побитовые операторы, распечатать 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. Добавьте подчеркивание после каждого 4-го числа, используя маску разделителя (например, 0000_1000)

Я новичок в C ++, мой учитель даже не посмотрел бы на мой код, пожалуйста, кто-нибудь объяснит, и постараюсь сохранить его базовым Спасибо!

0

Решение

Вот идея, используйте флаг, чтобы указать начальную нулевую цифру. Измените флаг, если бит равен единице. Печатайте цифру, только если она не является начальным нулем.

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:

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(), '_' );

внутри цикла

0

По вопросам рекламы [email protected]