【问题标题】:Reading and setting base 3 digits from base 2 integer从以 2 为基数的整数读取和设置以 3 为基数的数字
【发布时间】:2011-05-29 20:22:31
【问题描述】:

我的应用程序数据的一部分包含一组 9 个三进制(base-3)“位”。为了保持数据库的数据紧凑,我想将该数据存储为一个短的。由于 3^9

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

我想要做的是始终将值存储为短,并读取并设置到位的三进制位。理想情况下,我将拥有从二进制文件中获取和设置单个数字的功能。

我尝试过使用一些位移位和 mod 函数,但还没有想出正确的方法来做到这一点。我什至不确定是否有可能不进行完全转换。

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

【问题讨论】:

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


    【解决方案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]);
        }
    }
    

    【讨论】:

    • 这就是我想要的。谢谢!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您不能对三元值进行位运算。您需要使用乘法、除法和取模来提取和组合值。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多