2013-08-30 41 views
0

我有一個太大的二進制值。如何在objective-c中存儲過大的二進制值?

value1 : 2^300,000. 
value2 : 2^300,000. 

我想對'value1'和'value2'進行計算。

首先,如何存儲value1和value2? (int,float,double ... ???)

int value1 = 2^300000; 

這是正確的嗎?

這樣做是否完全存儲一個值?

上下文使用)
我有兩個數組有300,000個元素。

eg) array1 @ [@ "apple", @ "banana", @ "iphone", @ "TV", @ "clock" .... <= it has 300, 000. 
    array2 @ [@ "fruit", @ "fruit", @ "electric", @ "electric", @ "electric" ....] <= also has 300,000. 

顯示者優先的事情二進制:1,1,0,0,1 ...
顯示者優先實物二進制:1,1,0,0,0 ......

結果array1的計算'和'& array2:1,1,0,0,0 ...
我喜歡水果的「蘋果」和「香蕉」。

使用二進制計算的原因預計會比其他方式更快。

+5

你能提供這個問題的背景下?這些數字非常巨大。 –

+0

以及OP是誠實的:他們**太** ** –

+0

雅,waaaaaay太大。我認爲他必須推出自己的班級來進行計算,否則這將會非常痛苦,超過90000位數字,它將需要進行90000^2次乘法。這將會非常緩慢。 –

回答

2

第一件事是你沒有使用Objective-C類,而是普通的舊數據類型,又名POD。

這個大值遠遠超過整數的限制,甚至是64位無符號整數。我不是一個數學知識,所以我不確定它是否適合雙倍數,但這並不重要,因爲使用浮點數,你會失去精度。 (Link to WolframAlpha對於絕對不適合的確切值。)

你想要什麼可能是NSDecimalNumber其中38位精度提供了起來,那就是內置到庫中,如果您需要進一步精確,您可以編寫自己的類,或檢查出圖書館,如GMP

關於NSDecimalNumberhere有一個很好的問題和解答。

更新:正如Craig在評論中提到的那樣,您可能想要推出自己的課程來加速計算。像GMP這樣的圖書館是一般用途的,並且會以一種非常安全的方式進行計算,有時會浪費您的時間,因爲您希望做的計算可以簡化。

2

首先,^運營商不是電力運營商,而是bitwise XOR

所以2^300000實際上產生300002

其次可以使用NSDecimalNumber,的NSNumber一個子類,其根據文檔

提供了這樣做的基10算術的面向對象的包裝。一個實例可以表示可被表示爲尾數×10 ^指數任何數,其中尾數是十進制整數高達38位長,並且指數爲從-128到127

+1

更確切地說,它是一個按位異或。 –

+1

@RamyAlZuhouri絕對正確,謝謝 –

+2

我不認爲NSDecimalNumber足夠存儲這麼大的位掩碼,而且它缺少檢查個別位的方法。 – Sulthan

0

的整數。如果有300個000對象,你有沒有考慮過使用數據庫,例如核心數據?而不是一個非常大的掩碼,也許通過單個數據庫(核心數據)請求執行相同的操作會更容易。

爲了回答您的具體問題,整數的C-陣列將可能是最好的解決辦法:

const NUM_OBJECTS = 300000; 
//8 * sizeof(int) bits per an int 
int* mask = malloc((size_t) ceilf(NUM_OBJECTS/(sizeof(int) * 8.0f)); 
相關問題