Как вырезать биты из целого числа - PullRequest
0 голосов
/ 25 августа 2018

Я мог бы создать побитовое дерево, которое выглядит так:

                      x
         _____________|___________
        |                         |
     ___●___                   ___□___
    |       |                 |       |
   _■      _○                _■       □_
  |       |                 |           |
 _■     __■__           ____●___        ○____
|      |     |         |        |            |
●      ●     □_        ●       _○_        ___□
               |              |   |      |
               ○              ●   ○    __■
                                      |
                                      ●

Однако я хотел бы попробовать что-то другое. Вместо того, чтобы делать двоичные попытки (побитовые попытки) - которые основаны на взятии 1 бита за раз и выборе следующих 1 из 2 слотов для посещения - я хотел бы использовать 2 бита за раз или 3 бита за раз и т. Д. Использование 2-х бит за раз создаст дерево с 4 ветвями. Используя 3 бита, он будет иметь 8 ветвей. Это было бы неплохо использовать для небольшого сжатия дерева.

Так что мне интересно, как это сделать. Как взять целое число и по существу вырезать 2 или 3 или n бит за один раз. Итак, учитывая целое число, подобное этому:

10010110

То есть 150 в двоичном формате.

Я хотел бы получить, скажем, 2 байта за раз, так:

10
01
01
10

Это означало бы, что я поместил его в слот 2, затем 1, затем 1, затем 2. Или, если я выбрал 4 бита, то:

1001
0110

Это поместит его в слот 9, а затем в слот 6.

Итак, вопрос в том, как реализовать такую ​​функцию:

function sliceInteger(integer, start, length) {
  return integer[start..length]
}

var x = sliceInteger(150, 4, 4) // => 6

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Вы можете просто использовать побитовую арифметику:

function sliceInteger(integer, start, length) {
  return (integer >> start) & ((1 << length) - 1);
}
console.log(sliceInteger(150, 4, 4));

Редактировать

Я заметил, что в вашем вопросе вы срезаете справа налево, то есть MSB для LSB, тогда как функция, которую я написал выше, разрезает слева направо, то есть LSB для MSB, следовательно, она возвращает 9, где ваш предложенный результат равен 6. Если это это то, как вы хотите нарезать, вы должны использовать эту функцию вместо. Обратите внимание, что если вы хотите нарезать длиннее 8-битных целых чисел, вам необходимо соответствующим образом изменить 8 в коде.

function sliceInteger(integer, start, length) {
  return (integer >> (8 - start - length)) & ((1 << length) - 1);
}
console.log(sliceInteger(150, 4, 4));
0 голосов
/ 25 августа 2018

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

function sliceInteger(integer, start, length) {
  var binary = integer.toString(2)
  binary = binary.slice(start, start+length)
  return parseInt(binary, 2)
}

console.log(sliceInteger(150, 4, 4))
...