获取整数的二进制表示

3

我刚刚接受了一道面试题,需要获取整数的二进制表示。这是我应该知道如何做的事情...例如,5的二进制表示为101,步骤大致如下:

// 5 % 2 = 1
// 5 / 2 = 2
// result = 1;

// 2 % 2 = 0
// 2 / 2 = 1
// result = 10

// 1 % 2 = 1
// 1 / 2 = 0
// result = 101

停止条件是当 ~~(1/2) === 0 时。

所以我有这个:

const getBinary = (v) => {

  let remainder, binary = 1;

  while (true) {

    remainder = v % 2;
    v = ~~(v / 2);

    if (v === 0) {
      return binary;
    }

    if (remainder === 0) {
      binary = binary * 10 + 1;
    }
    else {
      binary = binary * 10;
    }
  }

};

console.log(getBinary(5));

这样可以正常运行,但是binary变量被初始化为1。有没有办法改进,使其能够处理负数或者当0作为函数参数传递时仍然有效?


1
这不是很正确。对于10,它返回1101。 - Jeremy Kahan
是的,也许是这样,正在寻找正确的东西。 - Alexander Mills
负数应该使用二进制补码一进制补码还是只在二进制表示前加一个-符号? - ibrahim mahrir
4个回答

7
var integer = 52;
console.log(integer.toString(2));

这是一种简单的 JavaScript 函数,不需要冗长的代码。


2
如果您想从头开始编写,可以使用类似于以下内容的东西:

function toBinary(n) {
    n = Number(n);
    if (n == 0) return '0';
    var r = '';
    while (n != 0) {
        r = ((n&1)?'1':'0') + r;
        n = n >>> 1;
    }
    return r;
}
console.log(toBinary(5));
console.log(toBinary(10));
console.log(toBinary(-5));
console.log(toBinary(0));


使用位移运算符 >>> 有点作弊,但仍然是一个好的答案!+1。 - ibrahim mahrir
值得一提的是,如果您想要反转这个操作,您需要将其转换为Int32,因为JS中的位运算符仅限于32位。 - Keith

2

以下是一种方法。它有一个内部函数来处理基础内容,还有一个外部函数来扩展您的特殊情况。我更喜欢使用字符串表示。

const getBinary = v => {
   if (v === 0) return '';
   let remainder = v % 2;
   let quotient = (v - remainder) / 2;
   if (remainder === 0) {
      return getBinary(quotient) + '0';
   }
   else {
      return getBinary(quotient) + '1';
   }
}

const betterGetBinary = v => {
   if (v === 0) return '0';
   if (v < 0) return '-' + getBinary(-v);
   return getBinary(v);
}

console.log(betterGetBinary(-10));


感谢@ibrahim mahrir的编辑。这样格式更好,逻辑更直接。至于你上面的评论,我假设只有一个减号在正常前面,但问题可能希望得到其他答案。 - Jeremy Kahan
这个版本的额外好处是能够处理大于32位的数字。并且更兼容toString(2)的工作方式。 - Keith
1
不用谢!你真的应该考虑阅读一下编辑帮助,里面有很多好东西。顺便说一句,你的回答很棒,我还在等待OP对我的评论做出回应,看看这是否是他真正想要的。;-) - ibrahim mahrir

0
一个快速而不太完美的解决方案,虽然它“可能”有两个缺陷:
- Math.floor()
- 没有位运算符。

let getBinary = number => {
  let done = false;
  let resultInverted = [];
  let acc = number;
  while (!done) {
    let reminder = acc % 2;
    if (acc === 1) {
      done = true;
    }
    acc = Math.floor(acc / 2);
    resultInverted.push(reminder);
  }
  return Number(resultInverted.reverse().join(''));
};

console.log(typeof getBinary(2));
console.log(getBinary(5));
console.log(getBinary(127));


1
你可以使用 while(true),然后在 if(acc === 1) 中放置返回语句。 - Alexander Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接