如何从位运算符 (1 << X) 生成的数字中获取 X(数字)
How to get X (number) from a number made by a bit operator (1 << X)
假设我有这样的设置
var num = 1 << 9 //equals 512
//OR
num = 1 << 6 //equals 64
//OR
num = 1 << 6 ^ 1 << 9 //equals 576
//OR
num = 1 << 6 ^ 1 << 9 ^ 1 << 1 ^ 1 << 8 //equals 834
我正在尝试取一个数字,比如 834
并通过一个函数将其反转并获取当我左移值时生成的所有数字,在本例中为 834
,组成它的数字是 6、9、1 和 8。
或者,我想获取变量 num
并获取 1 << X ^ 1 << X
中的所有 X 值并将其转换为数组。
所以
var values = [0,1,2,3,6,7,8,9,10,12,14,16,17] //this can occur as X in 1 << X
function bitNumberToArray(bitNumber) {
var arr = [];
// what do I put here?
return arr;
}
console.log(bitNumberToArray(834))
//returns [1, 6, 8, 9] *ORDER DOESN'T MATTER*
如果你对我在做什么感到好奇,我正在获取一个用户,然后获取他们的标志(这只是一个数字)并将其转换成用户友好的东西,比如 This user is staff, holds badge X
on Discord
我不知道从哪里开始,朝正确的方向轻推会有所帮助。
您需要将您的数字转换为二进制,然后像这样收集所有正位的位置:
function bitNumberToArray(n) {
const bits = [...n.toString(2)].map(Number);
return bits.reduce((result, bit, index) => result.concat(bit ? bits.length - index - 1 : []), []);
}
测试:
const test = bitNumberToArray(834);
// returns [9, 8, 6, 1]
这只是数字的二进制表示
例如 834 等于 2^9 + 2^8 + 2^6 + 2
function getBinaryRepr(num){
let repr = []
while(num > 0){
repr.push(num % 2) //Parity
num = Math.floor(num/2) //Integer division
}
return repr //this is the binary representation of num
}
从这里得到那些 X:
getBinaryRepr(num).map((x,index) => x==0 ? x : index)
或更好:
getBinaryRepr(num).map(x => x==0 ? x : 2^x)
然后简单地将它们相加得到数字
编辑:注意到现在您根本不需要 0,所以:
getBinaryRepr(num).filter(x => x != 0).map((x,index) => x==0 ? x : index) //or x==1
您需要像这样检查每一位的按位与:
var values = [0,1,2,3,6,7,8,9,10,12,14,16,17]; //this can occur as X in 1 << X
function bitNumberToArray(bitNumber) {
return values.filter(bit => bitNumber & 1 << bit );
}
console.log(bitNumberToArray(834));
假设我有这样的设置
var num = 1 << 9 //equals 512
//OR
num = 1 << 6 //equals 64
//OR
num = 1 << 6 ^ 1 << 9 //equals 576
//OR
num = 1 << 6 ^ 1 << 9 ^ 1 << 1 ^ 1 << 8 //equals 834
我正在尝试取一个数字,比如 834
并通过一个函数将其反转并获取当我左移值时生成的所有数字,在本例中为 834
,组成它的数字是 6、9、1 和 8。
或者,我想获取变量 num
并获取 1 << X ^ 1 << X
中的所有 X 值并将其转换为数组。
所以
var values = [0,1,2,3,6,7,8,9,10,12,14,16,17] //this can occur as X in 1 << X
function bitNumberToArray(bitNumber) {
var arr = [];
// what do I put here?
return arr;
}
console.log(bitNumberToArray(834))
//returns [1, 6, 8, 9] *ORDER DOESN'T MATTER*
如果你对我在做什么感到好奇,我正在获取一个用户,然后获取他们的标志(这只是一个数字)并将其转换成用户友好的东西,比如 This user is staff, holds badge X
on Discord
我不知道从哪里开始,朝正确的方向轻推会有所帮助。
您需要将您的数字转换为二进制,然后像这样收集所有正位的位置:
function bitNumberToArray(n) {
const bits = [...n.toString(2)].map(Number);
return bits.reduce((result, bit, index) => result.concat(bit ? bits.length - index - 1 : []), []);
}
测试:
const test = bitNumberToArray(834);
// returns [9, 8, 6, 1]
这只是数字的二进制表示 例如 834 等于 2^9 + 2^8 + 2^6 + 2
function getBinaryRepr(num){
let repr = []
while(num > 0){
repr.push(num % 2) //Parity
num = Math.floor(num/2) //Integer division
}
return repr //this is the binary representation of num
}
从这里得到那些 X:
getBinaryRepr(num).map((x,index) => x==0 ? x : index)
或更好:
getBinaryRepr(num).map(x => x==0 ? x : 2^x)
然后简单地将它们相加得到数字
编辑:注意到现在您根本不需要 0,所以:
getBinaryRepr(num).filter(x => x != 0).map((x,index) => x==0 ? x : index) //or x==1
您需要像这样检查每一位的按位与:
var values = [0,1,2,3,6,7,8,9,10,12,14,16,17]; //this can occur as X in 1 << X
function bitNumberToArray(bitNumber) {
return values.filter(bit => bitNumber & 1 << bit );
}
console.log(bitNumberToArray(834));