2012-08-05 81 views
1

以下代碼檢查給定的數字是否遵循特定的二進制模式。C中BigInteger的二進制/位操作#

我寫了這段代碼,沒有考慮endian順序和數字是如何簽名的。

public static bool IsDiagonalToPowerOfTwo (this System.Numerics.BigInteger number) 
{ 
    byte [] bytes = null; 
    bool moreOnesPossible = true; 

    if (number == 0) // 00000000 
    { 
     return (true); // All bits are zero. 
    } 
    else 
    { 
     bytes = number.ToByteArray(); 

     if ((bytes [bytes.Length - 1] & 1) == 1) 
     { 
      return (false); 
     } 
     else 
     { 
      for (byte b=0; b < bytes.Length; b++) 
      { 
       if (moreOnesPossible) 
       { 
        if (bytes [b] == 255) 
        { 
         // Continue. 
        } 
        else if 
        (
         ((bytes [b] & 128) == 128) // 10000000 
         || ((bytes [b] & 192) == 192) // 11000000 
         || ((bytes [b] & 224) == 224) // 11100000 
         || ((bytes [b] & 240) == 240) // 11110000 
         || ((bytes [b] & 248) == 248) // 11111000 
         || ((bytes [b] & 252) == 252) // 11111100 
         || ((bytes [b] & 254) == 254) // 11111110 
        ) 
        { 
         moreOnesPossible = false; 
        } 
        else 
        { 
         return (false); 
        } 
       } 
       else 
       { 
        if (bytes [b] > 0) 
        { 
         return (false); 
        } 
       } 
      } 
     } 
    } 

    return (true); 
} 

如何調整此代碼以適應小端順序和符號?我試圖按照MSDN但沒有運氣。

+1

那麼BigInteger總是有符號的,總是小端順序... – craig1231 2012-08-05 23:05:25

+0

BigInteger已經提供了檢查它是否是兩個冪的功能。你可以用它將數字切成更小的數字,也可以遞歸地檢查它們。 – SimpleVar 2012-08-05 23:15:03

+0

@YoryeNathan:對我來說這是不可能的。問題的上下文過於複雜,不能在這裏解釋,但我確實知道我需要比較二進制模式。 – 2012-08-06 09:58:39

回答

1

測試

else if 
     (
      ((bytes [b] & 128) == 128) // 10000000 
      || ((bytes [b] & 192) == 192) // 11000000 
      || ((bytes [b] & 224) == 224) // 11100000 
      || ((bytes [b] & 240) == 240) // 11110000 
      || ((bytes [b] & 248) == 248) // 11111000 
      || ((bytes [b] & 252) == 252) // 11111100 
      || ((bytes [b] & 254) == 254) // 11111110 
     ) 

可以降低到else if ((bytes[b] & 128) == 128)。任何後來的測試都意味着第一個測試,因此已經完全確定了結果。我覺得你真的想在這裏是什麼

else if (bytes[b] == 128 
     || bytes[b] == 192 
     || bytes[b] == 224 
     || bytes[b] == 240 
     || bytes[b] == 248 
     || bytes[b] == 252 
     || bytes[b] == 254 
     ) 

除此之外,表示是固定的,ToByteArray給出了相同的表示計較機字節序。

+0

謝謝你指出。但是,對於大於128的值,這兩種情況下的結果都是錯誤的。我認爲這可能是因爲字節順序或更可能檢查符號位/字節。 – 2012-08-05 23:13:49

+0

@MichaelGraczyk不,考慮'0xA0'例如。 – 2012-08-05 23:24:53

+0

@DanielFischer你是對的。 – 2012-08-05 23:29:18