2012-08-05 83 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