我可以创建一个像这样的按位特里:
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
答案 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))