2012-10-13 44 views
3

我想檢查數字是否將所有偶數位或奇數位設置爲1並且只有它們。對於例如:檢查數字中的偶數或奇數位'

42是正確的,因爲在二進制代碼101010它擁有一切,只有偶數位集來1。 號碼21也是正確的,。

數字69例如。 1000101是不正確的,因爲只有三個奇數位集合到1

我試過使用不同的操作與^, &, >>, <<,我仍然不知道如何使用這些操作符來做到這一點。是的,我需要在C中使用邏輯運算符來執行此操作。

+0

要判斷一個數字是奇數還是偶數,只需要檢查* last *位。 – meagar

+0

你這樣做的目的是什麼? –

+0

[相關](http://stackoverflow.com/questions/109023/best-algorithm-to-count-the-number-of-set-bits-in-a-32-bit-integer) –

回答

5

這些數字有一個屬性,(x^(x >> 1)) + 1是2和y功率爲2,如果y & (y - 1) == 0

這樣一個測試可能是((x^(x >> 1)) + 1) & (x^(x >> 1)) == 0這會爲任何規模的數字工作的動力。

+0

是的,就是這樣!謝謝。 –

+0

這很好,但是將'(x ^(x >> 1))'存儲在一個單獨的變量y中會更好,因爲程序不需要重新計算該表達式的值了 –

1
bool isEven(int n){ 
    bool isEven = true; 
    while(n){ 
     if(n & 1){ 
      isEven = !isEven; 
     } 
     n = n >> 1; 
    } 

    return isEven; 
} 

只要n是!= 0,那麼(n)將繼續,但它仍然存在。 如果第一位是1,那麼我們將偶數參數更改爲相反(甚至變爲奇數,反之亦然),在每次迭代中,我們將數字向右移動一位。

+3

發佈代碼沒有幫助,請在1或2行解釋。 – zengr

+0

這並不回答被問到的問題。這將檢查該數字是否設置了偶數或奇數位。問題是要檢查所有奇數編號的位是否已設置,或者是否設置了所有已編號的位。 – Lindydancer

+0

opps將解決它,謝謝。 – roni

3
#include <stdio.h> 

int main(void) 
{ 
    unsigned uu; 

    for (uu=0; uu < 43; uu++) { 
     int res; 
     res = (((uu & 0xAAAAAAAA) == uu) || ((uu & 0x55555555) == uu)); 
     printf("%u: %d\n", uu, res); 
    } 
    return 0; 
} 
+0

如果人們開始評論(或更正)空白,非空白必須是正確的;-) – wildplasser

+0

0可能被認爲是一個特例,因爲它根本沒有位。 (但至少它沒有*錯誤的*位設置;-)根據要求,你當然可以單獨排除零。 – wildplasser