Как я могу преобразовать (двоичное) целое число в массив? - PullRequest
0 голосов
/ 24 октября 2018

У меня есть следующее поле выбора формы в моем HTML-коде -

<select multiple class="form-control" name="uploadSites[]" id="uploadSitesDecoded">
    <option value="1">Site 1</option>
    <option value="2">Site 2</option>
    <option value="4">Site 3</option>
    <option value="8">Site 4</option>
    <option value="16">Site 5</option>
    <option value="32">Site 6</option>
</select>

Теперь я хотел бы предварительно выбрать параметры на основе целочисленного значения, например, значение 15 должно предварительно выбирать сайт1, 2, 3 и 4.

Насколько я знаю, это можно сделать с помощью метода триггера jQuery -

$('#uploadSitesDecoded').val([1,2,4,8]).trigger('change');

Итак, я пытаюсь преобразовать 15в строку или массив как 1,2,4,8 (если кто-то не знает более простой способ).

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Похоже, вы пытаетесь найти массив чисел, которые оба:

  1. степень двойки (2 ^ n)
  2. меньше 15

Вы можете использовать Array.filter для этого

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

let powerOfTwo = [1, 2, 4, 8, 16, 32, 64]

let result = powerOfTwo.filter(function(item) {
  return item < 15
})

// the result should be [1, 2, 4, 8]
0 голосов
/ 24 октября 2018

Один из возможных способов добиться этого - преобразовать целочисленное значение в двоичную строку, используя toString(2).Затем вы можете перебрать строку и установить option, соответствующий индексу строки, выбранному, если значение равно 1.Как то так:

$('input').on('input', function() {
  var $options = $('#uploadSitesDecoded option');
  var binaryString = parseInt(this.value, 10).toString(2);
  binaryString.split('').reverse().forEach(function(n, i) {
    $options.eq(i).prop('selected', n === '1');
  });
}).trigger('input');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="number" value="1" min="0" max="63" /><br />
<select multiple class="form-control" name="uploadSites[]" id="uploadSitesDecoded" size="8">
  <option value="1">Site 1</option>
  <option value="2">Site 2</option>
  <option value="4">Site 3</option>
  <option value="8">Site 4</option>
  <option value="16">Site 5</option>
  <option value="32">Site 6</option>
</select>
0 голосов
/ 24 октября 2018

Я не знаю, является ли это наиболее оптимальным способом, но вот мое решение.Сначала я изменяю данный int на двоичный, а затем меняю его.Затем зациклите его, чтобы найти 1 в двоичном файле.

function dec2bin(dec){
    return (dec >>> 0).toString(2);
}

function reverseString(str) {
    return str.split("").reverse().join("");
}

$(document).ready(function() {
  var binary = reverseString(dec2bin(15));
  var values = [];
  var step = 1;
  
  for (var i = 0; i < binary.length; i++) {
    if(parseInt(binary.charAt(i)) === 1){
      values.push(step);
    }
    step *=2;
  }
  
  $('#uploadSitesDecoded').val(values).trigger('change');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<select multiple class="form-control" name="uploadSites[]" id="uploadSitesDecoded">
    <option value="1">Site 1</option>
    <option value="2">Site 2</option>
    <option value="4">Site 3</option>
    <option value="8">Site 4</option>
    <option value="16">Site 5</option>
    <option value="32">Site 6</option>
</select>
0 голосов
/ 24 октября 2018

parseInt(n, 10).toString(2)

Это даст вам побитовое представление n, затем вы можете циклически проходить через него char за char, чтобы получить степень 2 значений, соответствующих:

let n = 15; // The number you want to turn into an array of power of 2
let array = [];
let binaryRepresentation = parseInt(n, 10).toString(2);
binaryRepresentation = binaryRepresentation.split("").reverse().join(""); // You need to reverse the string to get the power of 2 corresponding
for(let i = binaryRepresentation.length - 1; i >= 0; i--){
     if(binaryRepresentation[i] == 1){
         array.push(Math.pow(2, i));
     }
}
console.log(array); // Check the array

Этот пример даст вам [8, 4, 2, 1]

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