连接三个 4 位值

本文关键字:三个 位值 连接 | 更新日期: 2023-09-27 18:35:13

我正在尝试从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 位值

您的表示形式是 base26,因此您将从三个字符的值中获得的答案不会是 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]));