-
Notifications
You must be signed in to change notification settings - Fork 0
/
reverse.js
111 lines (110 loc) · 8.45 KB
/
reverse.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
function reverseN(n, reversedNumber) {
return n != (1 >> 1)
? reversedNumber = reverseN(
//////////////////////////////* start divide n by 10 *//////////////////////////////////////////////////////
((((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) + ((((n >> 1)
+ (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >> (((1 << 1) << 1) << 1))
) + (((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) + ((((n >>
1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >> (((1 << 1) << 1) << 1
))) >> ((((1 << 1) << 1) << 1) << 1))) >> ((1 << 1) + 1))
//////////////////////////////* add 0 or 1 to the above based */////////////////////////////////////////////
//////////////////////////////* on whether or not the following *///////////////////////////////////////////
//////////////////////////////* calculation is greater than 9 */////////////////////////////////////////////
+ (((n - (((((((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) <<
1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >>
(((1 <<1) << 1) << 1))) + (((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >>
((1 <<1) << 1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1
) <<1))) >> (((1 << 1) << 1) << 1))) >> ((((1 << 1) << 1) << 1) << 1))) >> ((1 << 1) + 1)) <<
(1 << 1)) + ((((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) <<
1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >>
(((1 << 1) << 1) << 1))) + (((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >>
((1 << 1) << 1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1)
<< 1))) >> (((1 << 1) << 1) << 1))) >> ((((1 << 1) << 1) << 1) << 1))) >> ((1 << 1) + 1))) <<
1)) // end calculation
> ((((1 << 1) << 1) << 1) + 1)) // compare to 9
? 1 // add one if greater than 9
: (1 >> 1)) // add 0 if less than 9
//////////////////////////////* end divide n by 10 */////////////////////////////////////////////////////////
,
//////////////////////////////* start append to reverseNumber */////////////////////////////////////////////
//////////////////////////////* append(r) = (10*r) + modulus(n) *////////////////////////////////////////////
//////////////////////////////* start by getting 10*r *//////////////////////////////////////////////////////
(((reversedNumber << ((1 << 1) + 1)) + (reversedNumber << 1))) // 10*r
//////////////////////////////* then need to add the modulus *///////////////////////////////////////////////
//////////////////////////////* modulus(n) = n - 10*(n/10) */////////////////////////////////////////////////
//////////////////////////////* start by setting up n - *////////////////////////////////////////////////////
+ (n - // n -
//////////////////////////////* start divide n by 10 *///////////////////////////////////////////////////////
((((((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) + ((((n
>> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >> (((1 << 1) << 1) <<
1))) + (((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) + ((((n >>
1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >> (((1 << 1) << 1) << 1)))
>> ((((1 << 1) << 1) << 1) << 1))) >> ((1 << 1) + 1))
//////////////////////////////* add 0 or 1 to the above based */////////////////////////////////////////////
//////////////////////////////* on whether or not the following *///////////////////////////////////////////
//////////////////////////////* calculation is greater than 9 */////////////////////////////////////////////
+ (((n - (((((((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) <<
1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >>
(((1 <<1) << 1) << 1))) + (((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >>
((1 <<1) << 1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1
) <<1))) >> (((1 << 1) << 1) << 1))) >> ((((1 << 1) << 1) << 1) << 1))) >> ((1 << 1) + 1)) <<
(1 << 1)) + ((((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) <<
1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >>
(((1 << 1) << 1) << 1))) + (((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >>
((1 << 1) << 1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1)
<< 1))) >> (((1 << 1) << 1) << 1))) >> ((((1 << 1) << 1) << 1) << 1))) >> ((1 << 1) + 1))) <<
1)) // end calculation
> ((((1 << 1) << 1) << 1) + 1)) // compare to 9
? 1 // add one if greater than 9
: (1 >> 1)) // add 0 if less than 9
// (n/10)
//////////////////////////////* end divide n by 10 *///////////////////////////////////////////////////////
//////////////////////////////* then multiply by 8 *///////////////////////////////////////////////////////
<< ((1 << 1) + 1)) // multiply by 8
//////////////////////////////* now have 8*(n/10) *////////////////////////////////////////////////////////
//////////////////////////////* now need 2*(n/10) *////////////////////////////////////////////////////////
+ // add both 8 * (n/10) and 2 * (n/10)
//////////////////////////////* start divide n by 10 *////////////////////////////////////////////////////
((((((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) + ((((n
>> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >> (((1 << 1) << 1) <<
1))) + (((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) + ((((n >>
1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >> (((1 << 1) << 1) << 1)))
>> ((((1 << 1) << 1) << 1) << 1))) >> ((1 << 1) + 1))
//////////////////////////////* add 0 or 1 to the above based *////////////////////////////////////////////
//////////////////////////////* on whether or not the following *//////////////////////////////////////////
//////////////////////////////* calculation is greater than 9 *////////////////////////////////////////////
+ (((n - (((((((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) <<
1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >>
(((1 <<1) << 1) << 1))) + (((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >>
((1 <<1) << 1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1
) <<1))) >> (((1 << 1) << 1) << 1))) >> ((((1 << 1) << 1) << 1) << 1))) >> ((1 << 1) + 1)) <<
(1 << 1)) + ((((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) <<
1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1) << 1))) >>
(((1 << 1) << 1) << 1))) + (((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >>
((1 << 1) << 1))) + ((((n >> 1) + (n >> (1 << 1))) + (((n >> 1) + (n >> (1 << 1))) >> ((1 << 1)
<< 1))) >> (((1 << 1) << 1) << 1))) >> ((((1 << 1) << 1) << 1) << 1))) >> ((1 << 1) + 1))) <<
1)) // end calculation
> ((((1 << 1) << 1) << 1) + 1)) // compare to 9
? 1 // add one if greater than 9
: (1 >> 1))) // add 0 if less than 9
// (n/10)
//////////////////////////////* end divide n by 10 *//////////////////////////////////////////////////////
//////////////////////////////* then multiply by 2 *//////////////////////////////////////////////////////
<< 1))) // multiply by 2
) // end of passing parameters
: reversedNumber; // returned if n == 0
}
module.exports = function(n) {
if (typeof n !== 'number') {
throw new Error(`${n} is not a number`);
}
else if (n > Number.MAX_SAFE_INTEGER) {
throw new Error(`${n} is greater than ${Number.MAX_SAFE_INTEGER} which is the maximum safe integer`);
}
else if (n < 0) {
throw new Error(`${n} is less than 0`);
}
else {
return reverseN(n, 0);
}
};