Задать вопрос
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 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
lxsmkv
@lxsmkv
Test automation engineer
пусть
х = 0110
y = 1001
выражение записывает оба значения в одно сперва сдвигая первое на четыре знака влево, а потом соединяет со вторым значением
0110 0000
0000 1001
-------------
0110 1001

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

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

Похожие вопросы