Чтение и установка базовых 3 цифр из базовых 2 целых - PullRequest
0 голосов
/ 30 мая 2011

Часть данных моего приложения содержит набор из 9 троичных (base-3) "битов".Чтобы данные были компактными для базы данных, я хотел бы хранить эти данные в виде одного короткого отрезка.Так как 3 ^ 9 <2 ^ 15, я могу представить любое возможное 9-значное число основания-3 как короткое. </p>

Мой текущий метод - работать с ним как строка длиной 9. Я могу прочитать или установить любойцифра по индексу, и это приятно и легко.Чтобы преобразовать его в короткое, я в настоящее время вручную преобразую в основание 10 (используя цикл Shift-Add), а затем использую Int16.Parse, чтобы преобразовать его обратно в двоичное короткое замыкание.Чтобы преобразовать сохраненное значение обратно в строку base 3, я запускаю процесс в обратном порядке.Все это требует времени, и я хотел бы оптимизировать его, если это вообще возможно.

То, что я хотел бы сделать, это всегда сохранять значение как короткое, читать и устанавливать троичные биты на месте.В идеале у меня были бы функции для получения и установки отдельных цифр из двоичного файла.

Я пытался поиграть с некоторыми сдвигами битов и мод-функциями, но не совсем придумал правильный способ сделать это,Я даже не уверен, возможно ли это даже без полного преобразования.

Кто-нибудь может дать мне побитовую арифметическую магию, которая может помочь с этим?

Ответы [ 3 ]

1 голос
/ 30 мая 2011
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]);
    }
}
0 голосов
/ 30 мая 2011

Это небольшие цифры. Сохраняйте их по своему желанию, эффективно в памяти, но затем используйте поиск по таблице для преобразования из одной формы в другую при необходимости.

0 голосов
/ 30 мая 2011

Вы не можете выполнять битовые операции над троичными значениями.Вам нужно использовать умножение, деление и модуль для извлечения и объединения значений.

Чтобы использовать битовые операции, вам нужно ограничить упаковку до 8 троянов на короткую (т. Е. 2 ​​бита каждая)

...