如何从整数中切掉位

How to slice off bits from an integer

我可以创建一个如下所示的按位 trie:

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

不过,我想尝试一些不同的东西。而不是做 binary 尝试(按位尝试)——这是基于一次 1 位 并选择 2 个槽中的下一个访问——我想一次使用 2 位 ,或一次 3 位 ,等等。一次使用 2 位会创建一个有 4 个分支的 trie。使用 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

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

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

你可以只使用按位算术:

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

编辑

我注意到在你的问题中你是从右到左切片,即 MSB 到 LSB,而我在上面写的函数是从左到右切片,即 LSB 到 MSB,因此它 returns 9 在你建议的地方结果是 6。如果这是你想要切片的方式,你应该改用这个函数。请注意,如果要对长于 8 位的整数进行切片,则需要适当更改代码中的 8

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