forked from grunmouse/binary
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathz-order.js
92 lines (83 loc) · 1.37 KB
/
z-order.js
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
const {
lowerZeroCount,
lowerFlagCount,
flagCount,
flagNumbers,
nextEqFlag,
rotate,
allRot,
uniqueShift
} = require('./flags.js');
/**
* @param a : BigInt
* @param b : BigInt
* @return BigInt
*/
function zOrder(a, b){
let result = 0n;
for(let i of flagNumbers(a)){
result += (1n<<(i*2n));
}
for(let i of flagNumbers(b)){
result += (1n<<(i*2n+1n));
}
return result;
}
function zOrder3(a, b, c){
let result = 0n;
for(let i of flagNumbers(a)){
result += (1n<<(i*3n));
}
for(let i of flagNumbers(b)){
result += (1n<<(i*3n+1n));
}
for(let i of flagNumbers(c)){
result += (1n<<(i*3n+2n));
}
return result;
}
function zOrderN(arr){
let n = BigInt(arr.length);
for(let j =0n; j<n; ++j){
for(let i of flagNumbers(arr[j])){
result += 1n<<BigInt(i*n + j);
}
}
return result;
}
function zDimens(z){
let d = [0n, 0n];
for(let i of flagNumbers(z)){
let j = i % 2n;
let index = i / 2n;
d[j] += (1n<<index);
}
return d;
}
function zDimens3(z){
let d = [0n, 0n, 0n];
for(let i of flagNumbers(z)){
let j = i % 3n;
let index = i / 3n;
d[j] += (1n<<index);
}
return d;
}
function zDimensN(z, n){
n = BigInt(b);
let d = Array.from({length:n}, ()=>(0n));
for(let i of flagNumbers(z)){
let j = i % n;
let index = i / n;
d[j] += (1n<<index);
}
return d;
}
module.exports = {
zOrder,
zOrder3,
zOrderN,
zDimens,
zDimens3,
zDimensN
};