2014-12-08 2 views
0

Это в основном тот же вопрос, что и Implementing a C style bitfield in Java. Но есть ли способ сделать это типичным способом, не прибегая к использованию класса? В качестве примера приведем код некоторых «C»:напечатано int и битбитная упаковка в java

typedef struct 
{ 
    unsigned int x: 8; 
    unsigned int y: 8; 
} point; 

point getPoint() 
{ 
    point p; 
    p.x = 1; 
    p.y = 2; 
    return p; 
} 

«точка» красиво набраны и компилятор передает его вокруг как Int примитивный тип, который является очень эффективным. В Java, можно было бы использовать класс, чтобы содержать точку, а затем написать:

point getPoint() 
{ 
    return new point(1,2); 
} 

Я пытаюсь улучшить сильно рекурсивную программу Java игры, которая использует класс «точку» (среди других простых классов), и поэтому jvm делает циллионы новых операций и занимает огромное количество времени в сборке мусора. Изменение класса «точка» в упакованном int может или не может помочь, но его стоит сделать. Но я хотел бы иметь хороший тип «point» для использования в программе, а не просто объявлять «int» везде, где я использую эту точку.

+0

Не совсем, нет. –

ответ

0

Если вы зададите тот же вопрос, вы обязательно получите тот же ответ. №

Невозможно это сделать, это Java, за исключением того, что это делается вручную. Вы можете определить длинное значение и сдвинуть/замаскировать два ints там. Или у вас может быть int и хранить там два шорты. Но установив/получив значения, вам нужно будет сделать некоторые изменения и маскировку.

Смотрите этот вопрос/ответ: Packing two shorts into one int, dealing with negative and positive

0

В Java это не является, как правило, размер объекта, который затирает вас - это больше, как правило, как долго вы держать его. Однако - в некоторых случаях то, что вы, возможно, ищете, является изменчивым int.

/** 
* Mutable integer. 
*/ 
public class Mint { 
    private int i = 0; 

    public Mint() { 
    } 

    public Mint (int i) { 
    this.i = i; 
    } 

    /** 
    * @return the i 
    */ 
    public int get() { 
    return i; 
    } 

    /** 
    * @param i the i to set 
    */ 
    public int set(int i) { 
    this.i = i; 
    return i; 
    } 

    public int add (int i) { 
    this.i += i; 
    return i; 
    } 

    public int sub (int i) { 
    this.i -= i; 
    return i; 
    } 

    public int mul (int i) { 
    this.i *= i; 
    return i; 
    } 

    public int div (int i) { 
    this.i /= i; 
    return i; 
    } 

    public int mod (int i) { 
    this.i %= i; 
    return i; 
    } 

    @Override 
    public String toString() { 
    return Integer.toString(i); 
    } 
} 

Пожалуйста, будьте очень осторожны при использовании mutables - есть очень хорошая причина, почему создание классов неизменны является хорошей идеей.

Добавлено

При дальнейшем чтении вашего вопроса это не может быть столь же эффективным для вас, как это ваши Point объекты, засорение системы. Возможно, вы должны сделать свои объекты Point изменчивыми.

+0

GC был медленным. Затем я сохранил таблицу транспонирования между ходами, а не очищенными перед каждым движением, потому что часто некоторые из этих данных можно было повторно использовать. Теперь все объекты перемещения живут до первого столкновения, которое может быть некоторое время, возможно, минут. Это сделало его очень медленным. – user3332817

+0

Похоже, вы хотите, чтобы изменялись объекты 'Move', которые накапливаются. – OldCurmudgeon

0

jvm делает zillions новых операций и занимает огромное количество времени в сборке мусора.

Сколько всего человек () точек. Возможно, стоит сделать кеш очков и повторно использовать их, чтобы вы только создали несколько очков, которые вам нужны, и вообще не собирать мусор.

Точка должна быть объектом значения, так как координаты x и y одинаковы, не имеет значения, какой экземпляр Point возвращается.

+0

Я использовал пример x-y в качестве примера, но на самом деле я уже преобразовал его в один int. Игровая доска 10x10, поэтому нужно всего 100 очков.Но есть два других сильно используемых класса: Move и ValueMove. Move (x, y) имеет 100 * 100 возможных значений, которые также вписываются в int. Таким образом, используя кеш, я мог бы сохранить Move как класс, используя массив элементов 10000, и getMove (x, y) индексирует массив и возвращает Move. ValueMove - это значение Move и int. Это может содержаться в длительных операциях с упаковкой. ValueMove слишком большой для идеи кэша. – user3332817

+0

Кэш не должен предоставлять * Все * возможные значения. Просто самый используемый. – dkatzel