如何从整数中切出位

时间:2018-08-25 03:48:45

标签: javascript integer bit-manipulation bit

我可以创建一个像这样的按位特里:

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

但是,我想尝试一些不同的方法。我不想做 binary 尝试(按位尝试),而是一次获取 1位,然后选择要访问的2个插槽中的下一个,所以我不想这样做一次使用 2位,或一次 3位,依此类推。一次使用2位将创建一个具有4个分支的特里。使用3位,它将有8个分支。这样可以很好地压缩Trie。

所以我想知道如何做到这一点。如何获取一个整数,并且一次将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 :(得分:2)

您可以只使用按位算术:

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));

答案 1 :(得分:0)

您可以将数字转换为二进制字符串并进行拼接,然后将其转换为十进制数字

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))