我想檢查數字是否將所有偶數位或奇數位設置爲1並且只有它們。對於例如:檢查數字中的偶數或奇數位'
數42
是正確的,因爲在二進制代碼101010
它擁有一切,只有偶數位集來1
。 號碼21
也是正確的,。
數字69
例如。 1000101
是不正確的,因爲只有三個奇數位集合到1
。
我試過使用不同的操作與^, &, >>, <<
,我仍然不知道如何使用這些操作符來做到這一點。是的,我需要在C
中使用邏輯運算符來執行此操作。
我想檢查數字是否將所有偶數位或奇數位設置爲1並且只有它們。對於例如:檢查數字中的偶數或奇數位'
數42
是正確的,因爲在二進制代碼101010
它擁有一切,只有偶數位集來1
。 號碼21
也是正確的,。
數字69
例如。 1000101
是不正確的,因爲只有三個奇數位集合到1
。
我試過使用不同的操作與^, &, >>, <<
,我仍然不知道如何使用這些操作符來做到這一點。是的,我需要在C
中使用邏輯運算符來執行此操作。
這些數字有一個屬性,(x^(x >> 1)) + 1
是2和y
功率爲2,如果y & (y - 1) == 0
這樣一個測試可能是((x^(x >> 1)) + 1) & (x^(x >> 1)) == 0
這會爲任何規模的數字工作的動力。
是的,就是這樣!謝謝。 –
這很好,但是將'(x ^(x >> 1))'存儲在一個單獨的變量y中會更好,因爲程序不需要重新計算該表達式的值了 –
bool isEven(int n){
bool isEven = true;
while(n){
if(n & 1){
isEven = !isEven;
}
n = n >> 1;
}
return isEven;
}
只要n是!= 0,那麼(n)將繼續,但它仍然存在。 如果第一位是1,那麼我們將偶數參數更改爲相反(甚至變爲奇數,反之亦然),在每次迭代中,我們將數字向右移動一位。
發佈代碼沒有幫助,請在1或2行解釋。 – zengr
這並不回答被問到的問題。這將檢查該數字是否設置了偶數或奇數位。問題是要檢查所有奇數編號的位是否已設置,或者是否設置了所有已編號的位。 – Lindydancer
opps將解決它,謝謝。 – roni
#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;
}
如果人們開始評論(或更正)空白,非空白必須是正確的;-) – wildplasser
0可能被認爲是一個特例,因爲它根本沒有位。 (但至少它沒有*錯誤的*位設置;-)根據要求,你當然可以單獨排除零。 – wildplasser
要判斷一個數字是奇數還是偶數,只需要檢查* last *位。 – meagar
你這樣做的目的是什麼? –
[相關](http://stackoverflow.com/questions/109023/best-algorithm-to-count-the-number-of-set-bits-in-a-32-bit-integer) –