2

base15 (編集) 文字列から元の 12 ビット値を取得しようとしています。ゼロパディングを処理するには、Java のようなゼロフィル右シフト演算子が必要だと考えました。どうすればいいですか?

これまでのところ、次のコードではうまくいきません:

static string chars = "0123456789ABCDEFGHIJKLMNOP";

static int FromStr(string s)
{
int n = (chars.IndexOf(s[0]) << 4) +
        (chars.IndexOf(s[1]) << 4) +
        (chars.IndexOf(s[2]));

return n;
}

編集; コンテキストを完成させるために完全なコードを投稿します

static string chars = "0123456789ABCDEFGHIJKLMNOP";

static void Main()
{
    int n = FromStr(ToStr(182));

    Console.WriteLine(n);
    Console.ReadLine();
}

static string ToStr(int n)
{
    if (n <= 4095)
    {
        char[] cx = new char[3];

        cx[0] = chars[n >> 8];
        cx[1] = chars[(n >> 4) & 25];
        cx[2] = chars[n & 25];

        return new string(cx);
    }

    return string.Empty;
}

static int FromStr(string s)
{
    int n = (chars.IndexOf(s[0]) << 8) +
            (chars.IndexOf(s[1]) << 4) +
            (chars.IndexOf(s[2]));

    return n;
}
4

1 に答える 1

0

あなたの表現はbase26なので、3文字の値から得ようとしている答えは12ビットにはなりません.0..17575の範囲になり、15ビットが必要になります.

kビット単位で左にシフトすることは、 を乗算することと同じであることを思い出してください2^k。したがって、x << 4演算は 16 を乗算することと同じです。また、基数 X の数値を変換する場合、その桁に X のべき乗を掛ける必要があることを思い出してください。そのため、コードは数値を左にシフトするのではなく、26 を掛ける必要があります。 、 このような:

int n = (chars.IndexOf(s[0]) * 26*26) +
        (chars.IndexOf(s[1]) * 26) +
        (chars.IndexOf(s[2]));
于 2013-10-13T13:13:03.203 に答える