Попытка сделать проверку флага с побитовыми операторами в первый раз - PullRequest
0 голосов
/ 18 марта 2019

Итак, я наконец-то собираюсь попытаться оптимизировать свой код, где я делаю кучу проверок флагов ... Я пытаюсь начать с простого, просто используя 8 бит для представления восьмиугольника, у меня будет 8-битное число, которое представляет «использованные стороны» и 8-битное число, представляющее «неиспользованные стороны»

Очень прямолинейно, поскольку в восьмиугольнике удобно всего 8: D

Итак, что у меня есть в javascript

let sidesNotInUse = 0b11111111;
let sidesInUse = 0b00000000;

Я хочу написать следующие функции

function inUse(sideIndex) {
    // checks that the 1 flag at index is set in sidesInUse
}

function use(sideIndex) {
    if(!(inUse(sideIndex))) {
    // operator to set flag at index in sidesInUse to 1 and sidesNotInUse to 0
  }
}

function unuse(sideIndex) {
    if(inUse(sideIndex)) {
        // operator to set flag at index in sidesInUse to 0 and sidesNotInUse to 1
  }
}

Не уверен, что я смотрю на это неправильно, но любая помощь будет полезна

1 Ответ

1 голос
/ 18 марта 2019

Используя mask , мы можем указать, какой бит мы хотим изменить.

let mask = 1 << 3;

означает, что мы хотим изменить бит в позиции 4 справа 0000 0 000.

Исходя из этого, мы можем уточнить вашу функцию inUse (), чтобы она возвращала бит в определенной позиции:

function inUse(sideIndex) {
  let mask = 1 << sideIndex;
  if ((sidesInUse & mask) != 0) {
    return true;
  } else {
    return false;
  }
}

Использование |(ИЛИ) оператор, мы можем установить бит в 1, а комбинация оператора ~ (НЕ) и & (И) дает нам возможность окончательно установить бит в 0.

function use(sideIndex) {
  let mask = 1 << sideIndex;
  if (!(inUse(sideIndex))) {
    sidesInUse |= mask;
    sidesNotInUse &= ~mask;
  }
}

function unuse(sideIndex) {
  let mask = 1 << sideIndex;
  if (inUse(sideIndex)) {
    sidesInUse &= ~mask;
    sidesNotInUse |= mask;
  }
}

Кстати, вам не нужны два двоичных числа, достаточно одного, чтобы знать, используется ли сторона или нет.

...