从基数2整数读取和设置基数3位数

时间:2011-05-29 20:22:32

标签: c# math bit-manipulation base-conversion

我的部分应用程序数据包含一组9个三元(base-3)“位”。为了保持数据库的数据紧凑,我想将这些数据存储为一个简短的数据。从3 ^ 9< 2 ^ 15我可以表示任何可能的9位数3 - 3作为简短。

我目前的方法是使用长度为9的字符串。我可以通过索引读取或设置任何数字,这很简单。要将它转换为short,我目前正在手动转换为base 10(使用shift-add循环),然后使用Int16.Parse将其转换回二进制short。要将存储的值转换回基数3字符串,我将反向运行该过程。所有这些都需要时间,如果可能的话我想优化它。

我想要做的是始终将值存储为short,并读取和设置三元位。理想情况下,我可以使用函数从二进制文件中获取和设置各个数字。

我尝试过使用一些位移和mod功能,但是没有找到正确的方法来做到这一点。我甚至不确定如果没有经过完全转换,它是否可能。

任何人都可以给我任何可以帮助解决这个问题的按位算法吗?

3 个答案:

答案 0 :(得分:1)

public class Base3Handler
{
    private static int[] idx = {1, 3, 9, 27, 81, 243, 729, 729*3, 729*9, 729*81};

    public static byte ReadBase3Bit(short n, byte position)
    {
        if ((position > 8) || (position < 0))
            throw new Exception("Out of range...");
        return (byte)((n%idx[position + 1])/idx[position]);
    }

    public static short WriteBase3Bit(short n, byte position, byte newBit)
    {
        byte oldBit = ReadBase3Bit(n, position);
        return (short) (n + (newBit - oldBit)*idx[position]);
    }
}

答案 1 :(得分:0)

这些是小数字。根据需要存储它们,高效地存储在内存中,然后根据需要使用表查找从一种形式转换为另一种形式。

答案 2 :(得分:-1)

您无法对三元值执行位操作。您需要使用multiply,divide和modulo来提取和组合值。

要使用位操作,您需要将打包限制为每短8个三进制(即每个2位)