2013-02-26 1 views
0

Задача, которую я попытался сделать, прошла через установленный срок, поэтому вы не выполняете мою домашнюю работу.Использование Побитового для создания двоичных чисел (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-го числа, используя Seperator маску (напр. 0000_1000)

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

+0

Возможно, мы не выполним домашнее задание, но мы дополняем ваше исследование. Какой учебник вы используете? Как учитель ожидал, что вы выполните задание? Как вы думаете, кто это сделал? Это не связано с умением или заставить других делать это за вас, это тяжелая работа. Как говорила моя бабушка * «Тяжелая работа никогда не бывает легкой, всегда трудно!» *. –

ответ

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

При сканировании справа налево, то это будет проще, так как вам не нужно, чтобы удалить начальные нули, а просто остановиться, когда число 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; 
} 

для изменения минимального witdth вам нужно будет немного изменить условие цикла, чтобы добавить unserscore может быть столь же просто, как:

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

внутренняя петля