2013-09-22 40 views
0

我處於搜索「最高有效位」的特殊情況下結果太多了,我無法找到符合我需要的答案!查找長整數中最顯着的位集合

這個問題本身很簡單:「如何找到無符號長整數中最重要的位?當我進行計算時,最右邊的位置是位置'0'。

我知道,它涉及屏蔽的最低位,檢查和再左移一次,同時增加我的計數,然後用第二個最低重複等

我這樣做過,但不管是什麼原因我現在無法做到。


編輯:所謂「最顯著」我的意思是最左邊的盤位,遺憾的任何困惑*


下面是我運作的解決方案和一些測試用例:

#include <stdio.h> 

int findExponent(unsigned long L){ 

    int exponent = -1; 

    unsigned long shift = L; 

    while(0 != shift) 
     exponent++, shift >>=1; 

    if (exponent >= 0) 
     printf("The most significant bit of L is at position %d\n", exponent); 
    else{ 
     exponent = 0; 
     printf("L is zero\n"); 
    } 
    return exponent; 
} 


int main(int argc, char** argv){ 

    long check = 8L; 

    findExponent(check);//2 
    findExponent(21421L);//14 
    findExponent(0L);//(is zero) 
    findExponent(1L);//0 
} 
+1

「最顯著位」和「最右邊的位」可能是不同的東西 – LihO

+0

我做出的某處一個錯字?如果我這樣做,我很抱歉。我的意思是找到最左邊的一組位。 – Joshua

+0

@LihO:是的,但這是解釋性的,即位位置值從0開始從右向左增加。 –

回答

3

「如何找到無符號長整數中最重要的位?」

您可以向右移位,直到最後一位被刪除。在這一刻,如果該值簽訂的所有底片有一個最有意義的一點,否則爲零:)

右移和XOR與一個人的價值變爲0

#include <stdio.h> 
int main(void) { 
      unsigned long x = 3333; 
      unsigned long y = x; 
      int p = -1; 
      while (0 != y) 
       p++, y >>= 1; 
      if (p >= 0) 
       printf("The most significative bit of x is at position %d\n", p); 
      else 
       printf("x is zero\n"); 
} 
+0

今天早上躺在牀上我其實也想到了非常相似的東西!猜猜我只是需要一些睡眠:)我喜歡p ++,y >> = 1,比我的想法更緊湊。 – Joshua

0

執行左移,直到有符號值小於0(if ((signed long)x < 0)),然後從MSb位置值中減去執行的移位次數(或者僅將d而不是)。

+0

「如何找到無符號長整數中最重要的位?」 – pablo1977

+0

錯過了那一點。幸運的是,您可以在比較中進行強制轉換,編譯器將DTRT。 –

0
unsigned long x = val & ((~0ULL >> 1)^(~0ULL)); 
當然

。 ..在一個8位的例子。

0011 1100 -> val 
1111 1111 -> (~0) 
0111 1111 -> (~0 >> 1) 
1000 0000 -> ((~0 >> 1)^(~0)) 
0000 0000 -> val & ((~0 >> 1)^(~0)) !most significant bit from val is zero 
+1

正如OP澄清,他實際上想要的最左邊的位位置,而不是該值的MSB。 – harold