将二进制字符串转换为其补码

时间:2017-07-13 08:39:45

标签: javascript

我在JavaScript中有以下字符串: "1011100111100110101110110"

我想对它执行一个操作,它会返回它的补码(也就是说,所有被0替换的零和所有被1替换的零)。

javascript文档说NOT运算符会完全这样做,但在我的测试中,它并没有给我我期望的结果。

我猜我的类型错误开始。

这是我的测试代码:

var nMyNumber = "1011100111100110101110110";
var sBinString = nMyNumber.toString(2);
console.log("Number: " + sBinString);

var reverse = ~sBinString;
console.log("Complement: " +  reverse);

6 个答案:

答案 0 :(得分:3)

只做字符串替换

var sBinString = nMyNumber
                .replace(/1/g,'x')//convert '1' to temp char('x')
                .replace(/0/g,'1')//convert '0' to '1'
                .replace(/x/g,'0')//finally convert temp char to '0'

答案 1 :(得分:2)

你的演员是错的。一种解决方案可以使用map



var nMyNumber = "1011100111100110101110110";
var reverse = nMyNumber.split('').map(x => x === "0" ? "1" : "0").join('');    
console.log("Number: " + reverse);



       

答案 2 :(得分:0)

字符串没有补充。 Numbers 可以有二进制补码。如果你想要通过补充恰好在字符串中的二进制值而产生的字符串,你将必须编写自己的函数来做到这一点。一种方法是计算二进制字符串表示的值,补充 ,并将该新数字转换为二进制字符串。

答案 3 :(得分:0)

如何更简单的方法 - >

var nMyNumber = "1011100111100110101110110";
nMyNumber = nMyNumber.split("");
for(var i=0;i<nMyNumber.length;i++) {
    if(nMyNumber[i] == 0) {
        nMyNumber[i] = 1;
    }
    if(nMyNumber[i] == 1) {
        nMyNumber[i] = 0;
    }
}
nMyNumber = nMyNumber.toString();
console.log(nMyNumber);

答案 4 :(得分:0)

~ Bitwise operator没有给出预期的输出,因为它对带符号的32位表示中的每个位执行NOT操作,结果将转换回正常数字,因此您无法获得预期的结果。

来自MDN docs

  

所有位运算符的操作数都以二进制补码格式转换为带符号的32位整数。二进制补码格式意味着一个数字的负数对应(例如5对-5)是所有数字的位反转

  

按位注意任何数字x的产量 - (x + 1)。例如,~5产生-6。

即使它无法按预期工作,但代码中仍存在一些错误:

  1. nMyNumber.toString(2)将不执行任何操作,返回相同的字符串。因此,您需要使用基数为parseInt的{​​{1}}转换为数字(对于二进制)。
  2. 最后2将保存一个以十进制格式记录的数字,以转换为二进制使用reverse(其中2表示二进制格式,例如toString(2))。
  3. String#replace与回调函数一起使用,并根据匹配的值在函数返回字符内使用。

    reverse.toString(2)

答案 5 :(得分:0)

如果您确实想要一个数字,请先将您的字符串转换为一个:

var x_as_binary_string = "1011100111100110101110110"
var x = parseInt(x_as_binary_string, 2);

现在要获得这个数字的补码,请按照你的说法使用NOT:

var complement = ~ x;

如果需要将其转换回二进制字符串:

var complement_as_string = complement.toString(2);