2
\$\begingroup\$

I made this decimal to binary conversion as an exercise for myself and because it is obviously often asked during job interviews / tests.

Any hints concerning possible improvements welcomed.

// -- START : Testing the function --------
var display = document.querySelector('div');
var result = '';
var n = 255;
var maxSpace = n.toString().length;

// Assigning wrong parameter.
console.log('Result empty: ' + getBinaryNumber());
console.log('Result string: ' + getBinaryNumber('abc'));

// Helper function: Avoiding "stairs".
function getSpaces(count, someChar) {
  
  if (!count) return '';
  
  var ret = '';
  
  for (var i = 0; i < count; i++) {
    ret += someChar;
  }
  
  return ret;
}

var spaces = getSpaces(maxSpace, '0');

for (var i = 0; i <= n; i++) {
  result += 
    (spaces + i).slice(- maxSpace) + 
    ' : ' + getBinaryNumber(i, ' ') + '<br />';
}

display.innerHTML = result;
// -- END : Testing the function --------

// Converts a decimal number to a binary number.

// -- Parameter --------------------------
// Number - The decimal number to convert.

// -- Return -----------------------------
// String - The number in it's binary
// represention.
// On error: 
// Returns an empty string.

function getBinaryNumber (decimalNumber, separator) {
  // Parameter check
  if (decimalNumber === 0) return 0;
  
  if (!decimalNumber) return '';
  
  if (isNaN(decimalNumber)) return '';
  
  separator = separator || '';
  // Local variables
  var ret = [];
  var bit = decimalNumber % 2; 
  
  ret.push(bit);
  
  decimalNumber = ~~(decimalNumber / 2);
  
  while (decimalNumber > 1) {
    bit = decimalNumber % 2; 
    ret.push(bit);
    
    decimalNumber = ~~(decimalNumber / 2);
  }
  
  if (decimalNumber > 0) ret.push(decimalNumber);
  
  return ret.reverse().join(separator);
}
<div></div>

\$\endgroup\$
1
1
\$\begingroup\$

A general feeling after taking a glance at your code is that you do this:

if (decimalNumber > 0) ret.push(decimalNumber);

i.e. that you put in the same line of code, both the if statement and the if body.

I would expect to see (with brackets maybe):

if (decimalNumber > 0)
  ret.push(decimalNumber);

That might be of course a personal taste, but I thought it would be nice for you to think twice about it.


Also:

// Local variables
var ret = [];
var bit = decimalNumber % 2; 

everybody knows that ret and bit are local variables, so, think twice² for removing that comment.

\$\endgroup\$
1
  • \$\begingroup\$ Had the feeling that I need some kind of separator when opening another "section" after the parameter-checks. But yes you are right. It's a bit stupid within there. \$\endgroup\$ Mar 9 '16 at 12:46
2
\$\begingroup\$

Comment says, that function will return a string, and then returns a number.

if (decimalNumber === 0) return 0

Best improvement would be using a native method

function getBinaryNumber(num, sep) {
    if (typeof num != "number") num = parseFloat(num)
    return sep ? num.toString(2).split("").join(sep) : num.toString(2)
}

I would remove separator parameter, as it makes no sense to combine this functionality.

function getBinaryNumber(num) {
    return (typeof num == "number" ? num : parseFloat(num)).toString(2)
}
\$\endgroup\$
2
  • \$\begingroup\$ Thanks a lot. You've given me lots of useful hints. :) But concerning the isNaN-check you are wrong. It shall intercept the case: Something which can't be converted to a number (e.g. 'a#bc') has been given as parameter. Without that check 'bit' gets the value NaN after applying the mod-operator the first time. This would become the return value later. \$\endgroup\$ Mar 10 '16 at 7:31
  • \$\begingroup\$ My bad about isNaN, removed this from answer \$\endgroup\$
    – Lauri
    Mar 10 '16 at 11:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.