javascript反转数字的二进制值

时间:2010-12-02 18:12:34

标签: javascript bitwise-operators

我想首先将数字转换为二进制,然后逐位反转.. 像这样:

数字是793 = 1100011001  然后将二进制值转换为:0011100110

在javascript中我可以执行以下操作:

var x = 793;
document.write(x.toString(2)); // gives 0011100110

这会给我数字的二进制值.. 但是如何按位反转二进制?

我尝试了〜操作符,但可能无法正常工作......输出为:-1100011010

任何帮助? 提前谢谢

6 个答案:

答案 0 :(得分:9)

MooGoo的回答是正确的。

以下是有关正在发生的事情的一些信息....让我们假设这是一个64位整数。

793 = 1100011001
~793 = -794 = 1111111111111111111111111111111111111111111111111111110011100110
0x3ff = 1111111111
(-793 & 0x3ff) = 11100110

因此,您可以使用此代码解决所有情况:

var x = 793; // input value
var y = x.toString(2);
var yl = y.length;
var mask = (Math.pow(2,yl)-1); // calculate mask
var result = ~x & mask;
document.write(result.toString(2)+"<br/>");

答案 1 :(得分:8)

您需要使用位掩码。

(~793 & 0x3ff).toString(2) //11100110

或使用XOR

793 ^ 0x3ff

答案 2 :(得分:4)

您希望使用111111111对二进制值进行异或运算 - 但是原始数字中的数字为1。所以:

var x = 793;
var result = x ^ parseInt((new Array(x.toString(2).length+1)).join("1"),2);

(来自PHP.JS的str_repeat代码)

多年后重访,试试:

var x = 793;
var result = parseInt(x.toString(2).replace(/[01]/g,function(n) {return 1-n;}),2);

我相信这会更有效......可能。可能完全错了。哦,好吧。

答案 3 :(得分:0)

我只是这样做

假设x = -11.3,它是从某处开始的16位整数。

我的结果将进入变量r。

var r = ((x & 0x7FFF) ^ 0x7FFF)+1;

这是接吻的原则。

答案 4 :(得分:0)

不是最短的代码,但更具可读性。我的技术类似于@Ivo Wetzel

const bitwiseComplement = (N) => {
  let binary = N.toString(2); // 793 is "1100011001" in binary
  binary = binary.split('').map(x => {
    return (x == 1) ? 0 : 1;
  }).join('');
  return binary; // with complement "0011100110" in binary
};

console.log(bitwiseComplement(793));

单线javascript解决方案。正则表达式/[0-1]/g表示匹配[0-1]下面列表中存在的单个字符。

const bitwiseComplement = (N) => {
  return N.toString(2).replace(/[0-1]/g, (v) => (v == 1 ? 0 : 1));
};

console.log(bitwiseComplement(793));

答案 5 :(得分:-1)

更新

我不清楚你是否想要一个倒置值的字符串,如果是这样你可以这样做:

function invert(x){
    var e = x.toString(2).split('');
    for(var i = 0, l = e.length; i < l; i++) {
        e[i] = e[i] === '0' ? '1' : (e[i] === '1' ? '0' : e[i]);
    }
    return e.join('');
}
invert(793); // '0011100110'
invert(-793); // '-0011100110'

这也将保留前导零。