Coverage

100%
83
83
0

/Users/sebastiansandqvist/Documents/Sites & Projects/apps/modules/s-binary/index.js

100%
83
83
0
LineHitsSource
11'use strict';
2
3// ----------------------------------------------------------------------
4// ----- main exported object
5// includes:
6// 1. unit conversions
7// 2. arithmetic functions
8// 3. logical operators
9// 4. helper methods
10// ----------------------------------------------------------------------
11
121var binary = module.exports = {};
13
14// ----- unit conversion
15// ---------------------------------------
161binary.toInt = function(str) {
174 return parseInt(str, 2);
18};
19
201binary.toHex = function(str) {
212 return parseInt(str, 2).toString(16);
22};
23
241binary.toBinary = function(n) {
252 return n.toString(2);
26};
27
28
29// ----- arithmetic
30// ---------------------------------------
311binary.add = function(a, b) {
326 a = parseInt(a, 2);
336 b = parseInt(b, 2);
346 return (a + b).toString(2);
35};
36
371binary.addBits = function(a, b) {
384 a = a === '1' ? 1 : 0;
394 b = b === '1' ? 1 : 0;
40
414 var sum = a ^ b;
424 var carry = a & b;
43
444 return {
45 sum: sum.toString(),
46 carry: carry.toString()
47 };
48};
49
501binary.multiply = function(a, b) {
516 a = parseInt(a, 2);
526 b = parseInt(b, 2);
536 return (a * b).toString(2);
54};
55
561binary.divide = function(a, b) {
576 a = parseInt(a, 2);
586 b = parseInt(b, 2);
596 return (a / b).toString(2);
60};
61
62
63// ----- logic
64// ---------------------------------------
651binary.not = function(str) {
6613 var inverse = '';
6713 for (var i = 0; i < str.length; i++) {
6879 inverse += str[i] === '1' ? '0' : '1';
69 }
7013 return inverse;
71};
72
731binary.and = function(a, b) {
74
757 var eq = binary.equalize(a, b);
767 a = eq[0];
777 b = eq[1];
78
797 var result = '';
80
817 for (var i = 0; i < a.length; i++) {
8228 if (a[i] === b[i]) {
836 result += a[i];
84 }
85 else {
8622 result += '0';
87 }
88 }
89
907 return result;
91
92};
93
941binary.or = function(a, b) {
95
968 var eq = binary.equalize(a, b);
978 a = eq[0];
988 b = eq[1];
99
1008 var result = '';
101
1028 for (var i = 0; i < a.length; i++) {
10332 if (a[i] === '1' || b[i] === '1') {
10430 result += '1';
105 }
106 else {
1072 result += '0';
108 }
109 }
110
1118 return result;
112
113};
114
1151binary.nand = function(a, b) {
1163 var and = binary.and(a, b);
1173 return binary.not(and);
118};
119
1201binary.nor = function(a, b) {
1214 var or = binary.or(a, b);
1224 return binary.not(or);
123};
124
1251binary.xor = function(a, b) {
126
1274 var eq = binary.equalize(a, b);
1284 a = eq[0];
1294 b = eq[1];
130
1314 var result = '';
132
1334 for (var i = 0; i < a.length; i++) {
13416 if (a[i] !== b[i]) {
13513 result += '1';
136 }
137 else {
1383 result += '0';
139 }
140 }
141
1424 return result;
143
144};
145
1461binary.complement = function(str) {
1474 var inverse = binary.not(str);
1484 var complement = binary.add(inverse, 1);
1494 return binary.pad(complement, str.length);
150};
151
152
153// ----- etc
154// ---------------------------------------
1551binary.pad = function(str, n) {
15618 while (str.length < n) {
15737 str = '0' + str;
158 }
15918 return str;
160};
161
1621binary.equalize = function(a, b) {
163
16421 var aLen = a.length;
16521 var bLen = b.length;
166
16721 if (aLen > bLen) {
1681 b = binary.pad(b, aLen);
169 }
170
17121 if (bLen > aLen) {
17210 a = binary.pad(a, bLen);
173 }
174
17521 return [a, b];
176
177};