2015-01-21 27 views
1

我需要編寫一個函數,它需要一個整數(它表示真值表中的一行)和一個布爾數組,它存儲真值表的那一行的值。檢索具有非常數變量的真值表的單行

下面是一個例子真值表

Row| A | B | C | 
1 | T | T | T | 
2 | T | T | F | 
3 | T | F | T | 
4 | T | F | F | 
5 | F | T | T | 
6 | F | T | F | 
7 | F | F | T | 
8 | F | F | F | 

請注意,一個給定的真值表可能比此表更多或更少的行,因爲可能的變量的數目可以改變。

函數原型可能看起來像這樣

getRow(int rowNum, bool boolArr[]); 

如果調用此函數,例如,作爲

getRow(3, boolArr[]) 

它需要包含下列元素返回數組

|1|0|1| (or |T|F|T|) 

對我來說難度的增加是因爲變量的數量可能會發生變化,所以我增加或減少行數。例如,變量列表可以是A,B,C,D,E和F,而不是A,B和C.

我認爲最好的解決方案是編寫一個循環,行號,並基本上改變了數組的元素,就像它在二進制中計數一樣。這樣

1st loop iteration, array elements are 0|0|...|0|1| 
2nd loop iteration, array elements are 0|0|...|1|0| 

我不能爲我的生活弄清楚如何做到這一點,並不能在網絡上其他地方找到一個解決方案。對不起,所有的困惑,並感謝您的幫助

+0

哪裏公式本身發揮作用嗎?目標是找出單個變量分配對於表的給定行,或者如何解析公式以評估? – templatetypedef 2015-01-21 03:56:44

+0

@templatetypedef最終目標是解析具有任意數量變量的每個可能的真值的公式。實質上,檢查真值表的每一行以查看它是否滿足公式。這就是爲什麼能夠分別生成真值表的每一行非常重要的原因。例如,如果a,b和c是變量,我需要檢查三者的真假組合,看看哪些組合導致整個公式爲真。 – FutureShocked 2015-01-21 04:04:12

+0

請嘗試改善問題陳述。你提到'genTruth'而不解釋函數應該計算什麼,然後跳到bitshifts。如果你首先明確說明問題並解釋你的方法,這將有助於你的解釋。 – Pradhan 2015-01-21 04:47:50

回答

1

好吧,現在你重寫你的問題要清楚得多。首先,getRow需要額外的參數:位數。第1行的2位與64位的第1行產生不同的結果,因此我們需要一種方法來區分它。其次,通常使用C++,一切都是零中毒的,所以我將把真值表向下移動一行,以便「0」行返回所有的true s。

這裏的關鍵是要認識到,在二進制行號已經是你想要的。藉此行(已經下移的4比3):

3 | T | F | F | 

3二進制是011,這倒爲{true, false, false} - 你想要什麼。我們可以表達,使用按位或數組:

{!(3 | 0x4), !(3 | 0x2), !(3 | 0x1)} 

所以它只是一個寫,作爲一個循環的事:

void getRow(int rowNum, bool* arr, int nbits) 
{ 
    int mask = 1 << (nbits - 1); 
    for (int i = 0; i < nbits; ++i, mask >>= 1) { 
     arr[i] = !(rowNum & mask); 
    } 
} 
+0

對不起,我嘗試通過將OP中的變量重命名爲字母而不是數字來澄清一點。 我不認爲這是正確的,基於我所能理解的cplusplus參考頁面。它看起來像你的函數版本正在返回整個真值表,但我需要能夠一次生成一行。兩個變量的真值表的第一行是[T | T],第二行是[T | F],第三個[F | T]和第四個[F | F]。我很抱歉,如果這聽起來有點居高臨下,只是儘量澄清。 – FutureShocked 2015-01-21 04:13:25

+0

@FutureShocked如果你只想要真值表,那只是我答案中的「bits」變量。這將是'rowNum'行中的值。 – Barry 2015-01-21 04:22:03

+0

雖然這隻返回一個布爾值,不是嗎?即使忽略rowNum對於大於3的任何數量的變量都會大於8,我仍然需要該函數來返回行中每個變量的布爾值。 – FutureShocked 2015-01-21 04:35:38