2010-08-16 3 views
1

Для приложения мне нужно иметь неподписанный тип данных с 24 битами. К сожалению, такой тип данных недоступен в Java. Я планирую реализовать его как новый класс. Но я не уверен в производительности такой реализации.Пользовательский тип данных в Java

Желательно ли написать собственный класс?

Если это целесообразно, возможно ли хорошее качество?

+4

Сколько из них будет активным в вашем приложении в любой момент времени? Если вы не говорите о количестве в миллионном порядке, вам лучше использовать целое число и «тратить» 8 бит на датуту, вместо того, чтобы пытаться оптимизировать, где вам не нужно. –

+0

@Anon, +1. Я бы поддержал это, если бы это был ответ. – aioobe

+0

Спасибо Anon. Я пишу индексатор для простой поисковой системы для рабочего стола. Поэтому, используя 24-разрядные целые числа без знака вместо 32-битных целых чисел, я надеюсь, что смогу сэкономить некоторое пространство. –

ответ

3

Если вы хотите, чтобы сэкономить место, вы можете использовать Int для caluclation и отобразить младшие 3 байта в байт [] или только три байта:

public static byte[] convert(int i) { 
    return new byte[]{ (i & 0xff0000) >> 16, (i & 0xff00) >> 8, (i & 0xff) }; 
    } 

    public static int convert(byte[] b) { 
    if (b == null && b.length != 3) 
     throw new IllegalArgumentException(); 

     return (b[2] << 16) | (b[1] << 8) | b; 
    } 

(не может проверить, если это ошибка бесплатно, но, по крайней мере, это должно дать идею)

+0

+1 Спасибо, это похоже на хорошее решение для моей проблемы. Также позвольте мне задать небольшой вопрос. Невозможно использовать байтовый массив, такой как byte [] value = new byte [3] вместо int data-type, чтобы представить фактическое значение числа. –

+0

Вычисление значения индекса на основе 'int' намного проще, чем выполнение его на' byte [] '. Я бы оставил расчет 'int' и преобразовал индекс в массив (или три байта) только для их сохранения. Вы можете обернуть 'byte []' в класс Integer24Bit или так, но тогда вы больше не будете экономить место. –

+0

Обратите внимание, что вы не сохраните пробел, сохранив байт [3] для каждого значения, поскольку каждый массив имеет свои собственные служебные данные. Вы хотите хранить все свои целые числа в одном большом байте [] и иметь некоторый способ вычисления, где начинается каждый (если каждый из них имеет ровно 3 байта, он может быть просто массивом [index% 3]). – Avi

4

Предположительно, вы имеете в виду реализовать как класс, который использует больший тип данных и проверки границ, как это:

public class Unsigned24 { 
    private static final MAX_UNSIGNED24 = Math.pow(2, 24) - 1; 
    private static final MIN_UNSIGNED24 = 0; 

    private final int value; 

    public Unsigned24(int value) { 
     if (value > MAX_UNSIGNED24 || value < MIN_UNSIGNED24) 
      throw new IllegalArgumentException("value out of bounds: " + value); 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 

// ... other methods, such as equals(), comparison, addition, subtraction, etc. 
} 

Это будет работать, но может быть не стоит свеч. Кроме того, на самом деле это не занимает всего 24 бита памяти, а скорее 32 плюс накладные расходы для объекта.

Это действительно зависит от ваших целей. Почему вы хотите 24-битное целое число.

Это просто потому, что у вас есть ограничения-ограничения на значения? Если это так, вы можете сделать что-то вроде выше.

Это потому, что у вас их много, и вы хотите сохранить память? Если это так, вам может понадобиться создать класс, который абстрагирует массив из 24-битных целых чисел и внутренне сохраняет их последовательно в байтовом массиве.

Это потому, что вы взаимодействуете с каким-либо аппаратным или сетевым интерфейсом, который ожидает ровно 24 бит? В этом случае вы можете посмотреть классы java.nio.

+0

Ави вправо. Если вам не нужна проверка границ, вам будет лучше использовать int. – LandonSchropp

+0

Math.pow (2, 24) - 1 == 0xffffff – aioobe

+0

Спасибо Ави. Я пишу индексатор для простой поисковой системы для рабочего стола. Поэтому, используя 24-разрядные целые числа без знака вместо 32-битных целых чисел, я надеюсь, что смогу сэкономить некоторое пространство. Поэтому я думаю, что ваш второй вариант (байтовый массив) может быть более практичным для моего сценария. –