evgeniy8705
@evgeniy8705
Повелитель вселенной

Как понять выражение при записи значений в поток вывода?

Для чего в методе writePoint() используется такое выражение? Как потом при считывании получить обратно значение x и y, если записывается всего одно значение value?
int value = point.getX() << 4 | point.getY();

class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        if (x < 0 || 15 < x) {
            throw new IllegalArgumentException();
        }

        if (y < 0 || 15 < y) {
            throw new IllegalArgumentException();
        }

        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    @Override
    public String toString() {
        return "Point(" + x + ", " + y + ")";
    }
}


class EntityOutputStream implements EntityOutput {
    private final DataOutput out;

    public EntityOutputStream(OutputStream out) {
        this.out = new DataOutputStream(out);
    }

    @Override
    public void writePoint(Point point) throws IOException {
        int value = point.getX() << 4 | point.getY();

        out.writeByte(value);
    }
}


public class App {
    public static void main(String[] args) throws IOException {
        Point point = new Point(11, 14);

        EntityOutputStream out = new EntityOutputStream(new FileOutputStream("c://file.txt"));
        EntityInput in = new EntityInputStream(new FileInputStream("c://file.txt"));

        out.writePoint(point);

        System.out.println(in.readPoint());
    }
}
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 1
lxsmkv
@lxsmkv
Test automation engineer
пусть
х = 0110
y = 1001
выражение записывает оба значения в одно сперва сдвигая первое на четыре знака влево, а потом соединяет со вторым значением
0110 0000
0000 1001
-------------
0110 1001

Можно унаследоваться и перегрузить конструктор, и работать с закодированым значением.
Или раскодировать при передаче значений в конструктор (int, int)
Зачем это все так сделано? Думаю для экономии места, 32 бита или 2 по 32. И если таких точек дофига, то это может влиять на производительность. Битовые операции насколько я знаю очень "легкие" для обработки. Но в таком случае нужно работать с кодированым значением, а сначала экономить а потом переливать в (int, int) - не вижу смысла, да. Хотя, может если кодированое значение должно передаваться по каналу связи, это уменьшит нагрузку на поток.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы