连接三个4位值

时间:2013-10-13 12:59:15

标签: c# bit-manipulation zerofill

我试图从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;
}

1 个答案:

答案 0 :(得分:0)

你的表示是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]));