多选与二进制数的互转

[TOC]

任意一个正整数转换成几个正整数

转换后所有正整数相加的和等于这个正整数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* 转换为数组
* 如下:
* 0 => [0]
* 1 => [1]
* 2 => [0, 2]
* 3 => [1, 2]
* 4 => [0, 0, 4]
* 5 => [1, 0, 4]
* 6 => [0, 2, 4]
*
* @param {Integer} num 数字
* @param {Integer} length 最小长度
* @param {Integer} defaultValue 默认值
* @return {Array}
*/
function toArray(data, length = 0, defaultValue = 0){
if(!data) return;

const arr = Array.from(Array(length)).map(item => defaultValue);

let temp = data.toString(2);
cosnt l = temp.length;

for (let i = 0; i < l; i++) {
arr[l - i -1] = (temp.charAt(i) == "1") ? Math.pow(2, l - i - 1) : 0
}

return arr;
}

几个数相加产生一个不会重复的数

这几个数是2的n次方和0,n为自然数,任意几个数相加的和不在数列内

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
* 转化为数字
* 如下:
* [0] => 0
* [1] => 1
* [0, 2] => 2
* [1, 2] => 3
* [0, 0, 4] => 4
*
* @param {Array} arr
* @return {Integer} 和
*/
function toNum(arr){
if(!arr || arr.length < 1) return 0;
var temp = 0;
for(var i in arr){
temp += parseInt(arr[i]);
}
return temp;
}