2013-02-26 34 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個號碼後,通過使用一個分隔符掩碼(例如:0000_1000)

我是新的C++,我的老師甚至不看我的代碼,請有人解釋,並嘗試保持基本。謝謝!

+0

我們可能不會做你的功課,但我們正在補充你的學習。你正在使用什麼課本?老師如何期待你完成作業?你如何看待別人完成它?這不是要聰明或讓別人爲你做,這是艱苦的工作。正如我祖母常說的那樣*「辛勤工作從來不容易,總是很難!」*。 – 2013-02-26 17:32:02

回答

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

inside loop