2

我正在尝试从 base15(编辑)字符串中获取原始的 12 位值。我想我需要一个类似于 Java 的 zerofill 右移运算符来处理零填充。我该怎么做呢?

到目前为止,以下代码没有运气:

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,因此您将从三个字符的值中得到的答案不是 12 位:它将在 0..17575 范围内,包括 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 回答