2015-09-04 82 views
2

我正在編寫一個程序來獲取數字的二進制表示。 我寫了這段代碼。生成二進制到二進制時出錯

#include <iostream> 

using namespace std; 
int main() { 
    int n, count = 0;; 
    int* br = new int(); 
    cin >> n; 
    while (n>0) { 
     if (n % 2) 
      br[count] = 1; 
     else 
      br[count] = 0; 
     n /= 2; 
     count++; 
    } 
    cout << count << endl; 
    for (int i = count - 1; i >= 0; i--) { 
     cout << br[i]; 
    } 
    return 0; 
} 

當我運行上面的程序我得到這個錯誤

Program received signal SIGTRAP, Trace/breakpoint trap. 
0x00007ffe8995a2dc in ntdll!RtlpNtMakeTemporaryKey() from C:\Windows\SYSTEM32\ntdll.dll 
Single stepping until exit from function ntdll!RtlpNtMakeTemporaryKey, 
which has no line number information. 
gdb: unknown target exception 0xc0000374 at 0x7ffe8995a31c 

Program received signal ?, Unknown signal. 
0x00007ffe8995a31c in ntdll!RtlpNtMakeTemporaryKey() from C:\Windows\SYSTEM32\ntdll.dll 
Single stepping until exit from function ntdll!RtlpNtMakeTemporaryKey, 
which has no line number information. 
[Inferior 1 (process 6368) exited with code 0377] 

可能是什麼可能的原因。 我是C++新手。

回答

2

,您應該使用int數組來保存各個位。現在你的代碼創建動態INT:

int* br = new int(); 

由於一個int的大小而變化,從實施到實施一個可移植的方式來做到這一點是:

#include<climits> 
..... 
int* br = new int[sizeof(int)*CHAR_BIT]; 

CHAR_BIT是一個常數從climits 「字符對象(字節)中的位數」。 sizeof(int)是int中的字符數(字節數)。 然後乘以你得到的int的位數。

雖然你並不真的需要動態記憶。使用堆棧存儲器更容易和更合適:

#include<climits> 
..... 
int br[sizeof(int)*CHAR_BIT]; 

以前的解決方案有一個共同的問題。他們都使用整個int來存儲一個位。這意味着浪費超過90%的存儲空間。對於這樣一個簡單的例子來說,這個問題是微不足道的,但在大型項目中可能會變成現實。
std::bitset是提高該一個很好的方法:

一個bitset存儲位(僅具有兩個可能的值的元素:0或1, 真或假,...)。

類模擬布爾元素的數組,但對於空間 分配最佳化:通常,每個元件只佔用一個比特(其中,上 大多數系統中,是比最小的元素種類較少八倍: 炭)。

#include<climits> 
#include<bitset> 
..... 
bitset<sizeof(int)*CHAR_BIT> br; 

的std :: bitset的是設計巧妙,你只需要改變的br聲明,它會工作,無需更改代碼的其餘部分。

+0

優秀的東西。 – molbdnilo

+0

如何使用'std :: vector '或者'std :: bitset'? –

+0

這將是一個非常好的主意。 –

2

指令

int* br = new int(); 

分配只是一個整數。您應該至少分配與要轉換的數據(32?64?)一樣多的位。 我想你最好使用一個靜態數組,所以

int br[64] ;