如何从整数中切掉位
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));
我可以创建一个如下所示的按位 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));