javascript反转数字的二进制值

tes*_*ipt 6 javascript bitwise-operators

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

number为793 = 1100011001,然后将二进制值转换为:0011100110

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

var x = 793;
document.write(x.toString(2)); // gives 0011100110
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助?提前致谢

Mar*_*p51 9

MooGoo的回答是正确的.

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

793 = 1100011001
~793 = -794 = 1111111111111111111111111111111111111111111111111111110011100110
0x3ff = 1111111111
(-793 & 0x3ff) = 11100110
Run Code Online (Sandbox Code Playgroud)

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

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/>");
Run Code Online (Sandbox Code Playgroud)


Moo*_*Goo 8

你需要使用位掩码.

(~793 & 0x3ff).toString(2) //11100110
Run Code Online (Sandbox Code Playgroud)

或者使用XOR

793 ^ 0x3ff
Run Code Online (Sandbox Code Playgroud)


Nie*_*sol 6

您想要将二进制值与 111111111 进行异或 - 无论原始值中有多少个 1。所以:

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

(str_repeat 的代码取自 PHP.JS)

多年后重温,尝试:

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

我相信这会更有效......可能。可能完全错误。那好吧。

  • 天哪,所有这些字符串修改都不太符合按位运算的精神,不是吗?你也可以这样做`793..toString(2).replace(/1/g, 'a').replace(/0/g, '1').replace(/a/g, '0') ` 但你可能会导致某处的 6502 CPU 熔化。 (2认同)

Ivo*_*zel -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'
Run Code Online (Sandbox Code Playgroud)

这也将保留前导零。