Что (int & 1)! = 0 означает - PullRequest
0 голосов
/ 25 марта 2020

Сегодня я управляю некоторым кодом от старого человека. Значение test1 - это загрузка из db, я постараюсь сделать это проще, как показано ниже.

$(document).ready(function () {
  $("#checkWeekday").click(function () {
    checkWeekday();
  })
});

function GetRepeatDOWs(_RepeatDOWs) {
  let WeekDay = [];
  if ((_RepeatDOWs & 1) != 0) {
    WeekDay.push(0);
  }
  if ((_RepeatDOWs & 2) != 0) {
    WeekDay.push(1);
  }
  if ((_RepeatDOWs & 4) != 0) {
    WeekDay.push(2);
  }
  if ((_RepeatDOWs & 8) != 0) {
    WeekDay.push(3);
  }
  if ((_RepeatDOWs & 16) != 0) {
    WeekDay.push(4);
  }
  if ((_RepeatDOWs & 32) != 0) {
    WeekDay.push(5);
  }
  if ((_RepeatDOWs & 64) != 0) {
    WeekDay.push(6);
  }
  return WeekDay;
}

function getWeekday(val) {
  switch (val) {
    case 0:
      console.log('Sunday');
      break;
    case 1:
      console.log('Mon');
      break;
    case 2:
      console.log('Tuesday ');
      break;
    case 3:
      console.log('Wen');
      break;
    case 4:
      console.log('Thur');
      break;
    case 5:
      console.log('Fri');
      break;
    case 6:
      console.log('Sat');
      break;
  }
}

function checkWeekday() {
  let check = parseInt($("#test1").val());
  var a = GetRepeatDOWs(check);
  for (i = 0; i < a.length; i++) {
    getWeekday(a[i]);
  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type ="text" id ="test1" value='127'>

<input type ="button" id="checkWeekday"  value="test">

Из приведенного выше кода вы можете видеть: номер 127 включен для всех дней недели, 3 включен для воскресенья и понедельника, как это работает? какая математика хранится в базе данных?

Ответы [ 4 ]

2 голосов
/ 25 марта 2020

if ((_RepeatDOWs & 1) != 0) проверяет, равен ли младший бит в _RepeatDOWs 1.

if ((_RepeatDOWs & 2) != 0), проверяется, равен ли второй бит в _RepeatDOWs 1.

. ..

if ((_RepeatDOWs & 8) != 0) проверяет, равен ли четвертый бит в _RepeatDOWs 1.

и т. Д.

1 голос
/ 25 марта 2020

несколько примеров для размышления

document.write('127 ->', (127).toString(2),'<br>')
document.write('0b1111111 ->', (0b1111111).toString(10),'<br>')

document.write('1 ->', (1).toString(2),'<br>')
document.write('2 ->', (2).toString(2),'<br>')
document.write('4 ->', (4).toString(2),'<br>')
document.write('8 ->', (8).toString(2),'<br>')
document.write('16 ->', (16).toString(2),'<br>')

document.write('127 & 4 ->', (127 & 4).toString(2),'<br>')

document.write('0b1111011 & 4 -> ', (0b1111011 & 4).toString(2),'<br>')
document.write('0b1111011 | 4 -> ', (0b1111011 | 4).toString(2),'<br>')
1 голос
/ 25 марта 2020

Это очень простая реализация набора битов. https://en.m.wikipedia.org/wiki/Bit_array Вы не видите такого рода хаки низкого уровня, используемые в наши дни. Код модема будет использовать вместо Set.

Структура данных с набором битов может представлять набор до n элементов в виде числа из n битов, где бит, находящийся в состоянии «включено» (или 1), соответствует предмет присутствует. Если бит выключен (0), элемент отсутствует. Бит численно является степенью двойки: первый элемент равен 1, второй элемент равен 2, затем 4, 8, 16 и т. Д.

Битовая операция И вычисляет пересечение двух множеств (" какие предметы присутствуют в обоих наборах "). Аналогично, OR вычисляет объединение («какие элементы присутствуют хотя бы в одном наборе»).

В найденном вами коде элементы - дни недели. Есть 7 дней, поэтому вам нужно 7 бит. Набор с воскресеньем и понедельником численно 1 + 2 = 3. Набор со всеми днями недели: 1 + 2 + 4 + 8 + ... + 64 = 127.

1 голос
/ 25 марта 2020

& - побитовый оператор AND. Он сравнивает значения (в 32-битном двоичном формате) по битам. Для каждого места, где оба значения имеют 1, выводится 1, если оба имеют 0 или одно имеет 0, а другое - 1, выводится 0.

Например:

Двоичный код для 8: 1000
Двоичный код для 12: 1100

Сравнивая эти два, мы видим, что только самый левый di git равен 1 для обоих значений.

Таким образом, результат равен 1000 или 8.

// show binary of 8
console.log( (8 >>> 0).toString(2) );

// show binary of 12
console.log( (12 >>> 0).toString(2) );

// show result of 8 & 12
console.log( 8 & 12 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...