2012-10-07 41 views
0

我在開始使用我的實驗時遇到了一些問題。實驗室有以下指示:枚舉類型的位操作

給定值int input = 0b10010110確定個人喜歡什麼運動。假設在這個輸入中不會有錯誤。從左到右,每個位置代表以下內容:足球,棒球,排球,游泳,壘球,足球,曲棍球,曲棍球。

如果在那個位置有一個1,那麼這個人就喜歡那個運動。基於給定的「二進制」輸入,輸出到用戶喜歡的所有運動畫面。對於給定的二進制數,用戶喜歡足球,游泳,足球和曲棍球。

  • 請勿製作字符數組。

  • 確保使用枚舉數據類型。

我不知道我怎麼可以比較字符串的每個位置,以判斷它是否是1或0。一個想法我是我每次運動設置爲使用枚舉類型十個的號碼,只有其相應的位置是1

enum sport{ 
    Football = 0010000000, 
    Baseball = 0001000000, 
    Volleyball = 0000100000, 
    ... , 
    Lacrosse = 0000000001 
}; 

我會再移位左/右給定的值「輸入」的次數進行適當的量,只留下所指定的位置與它的原始值,並設置所有其他值爲0.對於足球:

input << 2; input >> 9; input << 7; 

所以新的設定值將是0010000000。然後我可以將整個數字進行比較。對於每一個案例我都會這樣做,但我想不出一種不同的方式來做到這一點。

我完全不在嗎?是否有一種更有效的方法來檢查每個位置的值使用位操作?感謝您提前提供任何幫助。

+0

除了位移以外,還有一些操作符更適合檢查一位。 – chris

回答

0

使用位AND運算符&

if (input & Football) { 
    // Football bit is set 
} else { 
    // Football bit is not set 
} 

還要注意的是0b前綴是一個編譯器擴展,但也不是標準C.而在你enum值,數字開頭與0前綴是八進制格式(你必須解決這個問題)。我建議你使用十六進制格式進行位操作。

+0

所以AND運算符讓我繞過輸入值的移位和操作,是否正確? 你能給我一些關於0b前綴的意思嗎?必須使用「輸入」值,由我們的教師給予我們。我會用不同的前綴開始我的枚舉值嗎? –

+0

AND運算符比我最初認爲會使用的所有移位要簡單得多。我決定爲我所有枚舉類型添加前綴「0b」,並且程序正常工作。感謝您的幫助。 –

0

如果您通過在適當的位置向左移動1來定義運動值,則可以使事情更具可讀性;實際上,您可以使用簡單的枚舉來計算運動值,並使用它來指定有多少位移動位。

+0

然後,我會比較移位的值,像0010000000一些常數是否正確?每項運動向左移動的數量是其枚舉值橄欖球= 0,棒球= 1,...對不起,我只是想確保我明白你想說什麼。 –

+0

沒問題 - 這就是我們來這裏的原因。您將使用枚舉值作爲移動1的位置數(如1中的<< Lacross,其中Lacross將爲0),以此作爲獲取原始枚舉中的值的方法。使它更容易看到這些值來自哪裏。 –