2011-08-26 48 views
3

所以我有一個位序列:進入第n位沒有條件語句

1是MSB。

我的函數需要返回0的整數,如果奇數位爲0或1,如果它是一個1

我不能使用任何for循環或自然的東西,看看我是否需要返回0或1.有沒有人有任何建議如何去做這件事。

我正在考慮使用非操作,但我可以弄清楚如何正確使用它。

到目前爲止,我正在使用一個1010 ... 10的序列,然後去做它。做到這一點上面會得到我1010.現在我需要找出我是否返回1或0.

+2

這是功課?您將需要使用按位和(&&)運算符。你甚至可以使用按位或('|'),但是'&'在這種情況下更方便。 – Marlon

回答

8

說我們正在談論32位整數。我假設你想知道是否設置了任何奇數位(1)。

要做到這一點,我們創建一個看起來像這樣的整數:

10101010101010101010101010101010 

現在,如果我們AND(&)本,所有偶數位都過濾掉。現在,如果數字不爲零,則設置一個或多個奇數位。在C:

#include <stdint.h> 

int hasodd(uint32_t x) { 
    // 0xAAAAAAAA = 10101010101010101010101010101010 
    // double negation to turn x>0 into 1 and leave 0 alone 
    return !!(x & 0xAAAAAAAA); 
} 

如果你的意思是你應該返回是否設置第N位,這是有效的。它右移一個1到正確的位置,以過濾掉所有不相關的位:

#include <stdint.h> 

int nthbitset(uint32_t x, int n) { 
    return x & (1 << n); 
} 
+0

編輯完成後,我獲得了+1權利;-P – MByD

+0

那麼,事情是我只能使用8位製作,所以只有AA。我正在考慮將這些位移到24個位置,然後將這8位移動到那個位置。然後在另一個16位的變量中進行移位,並用稍微不同的數字來替換其前面的8位。之後,雖然我不知道如何結合他們,如果這將工作。你有什麼想法? – David

+0

@David:你能改說嗎?我沒有得到任何東西。 – orlp

3

我模糊你的問題—的意圖,它看起來像功課。根據您的實際需求是什麼(比如是在問題的標題或正文說的),這些人會在幾乎任何C實施工作:

int hasoddbitset (int v) 
{ 
    return (v & 0xaaaaaaaa) != 0; // for 32 bit ints 
} 

int isbitset (int val, int bitnum) 
{ 
    return (val & (1 << bitnum)) != 0; 
} 
+0

我發現你的代碼和我的代碼完全一樣(保存條件),並在12分鐘前發佈。請考慮刪除答案或添加新信息。 – orlp

+0

祝賀你......你仍然設法爲此得到兩個讚揚。順便說一下,你的'isbitset'函數被破壞了,提示:看'bitnum'。 – orlp

+0

@nightcracker:我的代碼不那麼冗長,使用更直接的操作來實現它的結果,所以它不是「完全一樣」,否則我不會發布它。雖然'!!'是有效的,它是晦澀難懂的,而且很可能是不必要的。(感謝您指出錯誤:將其刪除。) – wallyk