我在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);
答案 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。
即使它无法按预期工作,但代码中仍存在一些错误:
nMyNumber.toString(2)
将不执行任何操作,返回相同的字符串。因此,您需要使用基数为parseInt
的{{1}}转换为数字(对于二进制)。2
将保存一个以十进制格式记录的数字,以转换为二进制使用reverse
(其中2表示二进制格式,例如toString(2)
)。将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);