1

整数値が与えられた場合、その値を格納するために必要な最小バイト数を調べる方法が必要です。値は、最大 64 ビットの符号付きまたは符号なしの場合があります。符号付き整数の符号ビットも考慮してください。

例えば:

                          8     requires 1 byte at minimum
               unsigned 255     requires 1 byte at minimum
                 signed 255     requires 2 bytes at minimum
                       4351     requires 2 bytes at minimum
                -4294967296     requires 5 bytes at minimum
unsigned 0xFFFFFFFFFFFFFFFF     requires 8 bytes at minimum

多くの if ステートメントを使用して、これを解決する手っ取り早い方法を考えることができますが、これを行うためのより良い (たとえば、より単純で、より賢く、より高速な) 方法があるかもしれません。int (long value, bool signed)署名付きのメソッド、またはint (long value)(署名付き) と(署名なし) の 2 つのメソッドのいずれかを想定できますint (ulong value)

4

2 に答える 2

3

私自身の質問で試してみましょう。私が知る限り、これは正しい解決策ですが、速度と簡潔さの点で最適ではない可能性があります。

public static int GetMinByteSize(long value, bool signed)
{
    ulong v = (ulong)value;
    // Invert the value when it is negative.
    if (signed && value < 0)
        v = ~v;
    // The minimum length is 1.
    int length = 1;
    // Is there any bit set in the upper half?
    // Move them to the lower half and try again.
    if ((v & 0xFFFFFFFF00000000) != 0)
    {
        length += 4;
        v >>= 32;
    }
    if ((v & 0xFFFF0000) != 0)
    {
        length += 2;
        v >>= 16;
    }
    if ((v & 0xFF00) != 0)
    {
        length += 1;
        v >>= 8;
    }
    // We have at most 8 bits left.
    // Is the most significant bit set (or cleared for a negative number),
    // then we need an extra byte for the sign bit.
    if (signed && (v & 0x80) != 0)
        length++;
    return length;
}
于 2012-07-25T14:07:01.100 に答える
1
static int BytesForNum(long value, bool signed)
{
    if (value == 0)
        return 1;
    if (signed)
    {
        if (value < 0)
            return CalcBytes(2 * (-1-value));
        else
            return CalcBytes(2 * value);
    }
    else
    {
        if (value < 0)
            throw new ArgumentException("Can't represent a negative unsigned number", "value");
        return CalcBytes(value);
    }
}
//should only be called with positive numbers
private static int CalcBytes(long value)
{
    int bitLength = 0;
    while (value > 0)
    {
        bitLength++;
        value >>= 1;
    }
    return (int)(Math.Ceiling(bitLength * 1.0 / 8));
}

署名されたコードが正確ではないかもしれませんが、それが一般的な考え方です。

于 2012-07-25T13:09:39.540 に答える