1

以下代码检查给定数字是否遵循特定的二进制模式。

我编写此代码时没有考虑字节序以及数字的签名方式。

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,但没有运气。

4

1 回答 1

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无论机器字节序如何,都给出相同的表示。

于 2012-08-05T23:09:48.300 回答