以下代码检查给定数字是否遵循特定的二进制模式。
我编写此代码时没有考虑字节顺序以及数字是如何签名的。
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 ,但没有运气。
答案 0 :(得分: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
给出相同的表示,而不管机器的字节顺序。