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 に答える