以下代碼檢查給定的數字是否遵循特定的二進制模式。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但沒有運氣。
那麼BigInteger總是有符號的,總是小端順序... – craig1231 2012-08-05 23:05:25
BigInteger已經提供了檢查它是否是兩個冪的功能。你可以用它將數字切成更小的數字,也可以遞歸地檢查它們。 – SimpleVar 2012-08-05 23:15:03
@YoryeNathan:對我來說這是不可能的。問題的上下文過於複雜,不能在這裏解釋,但我確實知道我需要比較二進制模式。 – 2012-08-06 09:58:39