我在这里发布了解决此类问题的方案。它可以进行优化,但为了更好的可读性,我将其保留原始状态。
/** Convert number to address (dec) => split
* @param {Int} Number
* @return {Array} Array of 4 number
*/
function num2Addr(number) {
let binary = (''.padStart(32-number, '0')).padStart(32, '1'); // Create binary
let addr = [];
for(let i=0; i<4; i++) {
let gBin = binary.slice(i*8, i*8+8); // Split block binary 8bit
addr.push(parseInt(gBin,2)); // Bin to Number
}
return addr; // Return array of number
}
/** Convert address to dec => merge
* @param {Array} Address Number bit
* @return {int} Number
*/
function addr2Num(addr) {
let binary = '';
addr.map( bit=> { binary += Number(bit).toString(2) } )
let dec = binary.split('1').length - 1;
return dec;
}
// Check
for (let i=0; i<33; i++) {
console.log(i, num2Addr(i) ) ;
console.log(i, addr2Num( num2Addr(i) ) ) ;
}
/**
Output :
0 [ 0, 0, 0, 0 ]
0 0
1 [ 128, 0, 0, 0 ]
1 1
2 [ 192, 0, 0, 0 ]
2 2
3 [ 224, 0, 0, 0 ]
3 3
4 [ 240, 0, 0, 0 ]
4 4
5 [ 248, 0, 0, 0 ]
5 5
6 [ 252, 0, 0, 0 ]
6 6
7 [ 254, 0, 0, 0 ]
7 7
8 [ 255, 0, 0, 0 ]
8 8
9 [ 255, 128, 0, 0 ]
9 9
10 [ 255, 192, 0, 0 ]
10 10
11 [ 255, 224, 0, 0 ]
11 11
12 [ 255, 240, 0, 0 ]
12 12
13 [ 255, 248, 0, 0 ]
13 13
14 [ 255, 252, 0, 0 ]
14 14
15 [ 255, 254, 0, 0 ]
15 15
16 [ 255, 255, 0, 0 ]
16 16
17 [ 255, 255, 128, 0 ]
17 17
18 [ 255, 255, 192, 0 ]
18 18
19 [ 255, 255, 224, 0 ]
19 19
20 [ 255, 255, 240, 0 ]
20 20
21 [ 255, 255, 248, 0 ]
21 21
22 [ 255, 255, 252, 0 ]
22 22
23 [ 255, 255, 254, 0 ]
23 23
24 [ 255, 255, 255, 0 ]
24 24
25 [ 255, 255, 255, 128 ]
25 25
26 [ 255, 255, 255, 192 ]
26 26
27 [ 255, 255, 255, 224 ]
27 27
28 [ 255, 255, 255, 240 ]
28 28
29 [ 255, 255, 255, 248 ]
29 29
30 [ 255, 255, 255, 252 ]
30 30
31 [ 255, 255, 255, 254 ]
31 31
32 [ 255, 255, 255, 255 ]
32 32
*/