在javascript中反转无符号任意二进制位

时间:2017-02-25 00:32:36

标签: javascript

例如,10100将被转换为01011; 010将被反转为101; 101将转换为010。

问题是当我使用~5时,它变为-6,因为js使用32位签名。

如何反转无符号任意位二进制数?

我想创建一个函数,该函数接收这个无符号任意位二进制数并返回其反转形式(101-> 010)

我想从字符串101转换为010

7 个答案:

答案 0 :(得分:1)

反转位将始终相同,但要将无符号整数转换为有符号整数,可以使用无符号>>>移位运算符处理无符号数:

console.log(~5);     // -6
console.log(~5>>>0); // 4294967290

如果你想确保只翻转数字中的有效位,你会想要通过&操作来掩盖它,你需要多少有效位。以下是有效位屏蔽的示例:

function invert(x) {
  let significant = 0;
  let test = x;

  while (test > 1) {
    test = test >> 1;
    significant = (significant << 1) | 1;
  }

  return (~x) & significant;
}

console.log(invert(5));  // 2 (010 in binary)

答案 1 :(得分:1)

您可以创建一个翻转所需数字位数的功能

    var flipbits = function (v, digits) {
        return ~v & (Math.pow(2, digits) - 1);
    }
    console.log(flipbits(5, 3)); // outputs 2
    console.log(flipbits(2, 3)); // outputs 5

注意 - 这不是“任意位数”......最多只有32位

  

使用字符串,你可以拥有任意位长度(这一点不会在Internet Exploder中进行转换)

    var flipbits = str => str.split('').map(b => (1 - b).toString()).join('');

    console.log(flipbits('010')); // outputs 101
    console.log(flipbits('101')); // outputs 010

  

上述ES5

    var flipbits = function flipbits(str) {
      return str.split('').map(function (b) {
        return (1 - b).toString();
      }).join('');
    };

    console.log(flipbits('010')); // outputs 101
    console.log(flipbits('101')); // outputs 010

答案 2 :(得分:0)

在JavaScript中,〜或代字号执行此操作

  

- (N + 1)

因此,您当前的操作正确,但不是您要查找的内容:

~5
-(5 + 1)
-6

Reference

答案 3 :(得分:0)

您可以使用将数字转换为二进制的函数作为字符串,翻转0和1,然后转换回数字。它似乎给出了预期的结果,但看起来很丑陋:

&#13;
&#13;
function flipBits(n) {
  return parseInt(n.toString(2).split('').map(bit => 1 - bit).join(''),2)
}

[0,1,2,3,4,5,123,987679876,987679875].forEach(
   n => console.log(n + ' -> ' + flipBits(n))
);
&#13;
&#13;
&#13;

也许有一些按位运算符可以做同样的事情。

修改

您似乎正在使用字符串,因此只需拆分,翻转和再次加入:

&#13;
&#13;
// Requires support for ECMAScript ed 5.1 for map and 
// ECMAScript 2015 for arrow functions
function flipStringBits(s) {
  return s.split('').map(c => 1 - c).join('');
}

['0','010','110','10011100110'].forEach(
  v => console.log(v + ' -> ' + flipStringBits(v))
);
&#13;
&#13;
&#13;

ECMAScript ed 3的基本功能(适用于所有地方,甚至是IE 4)。

&#13;
&#13;
function flipStringBitsEd3(s) {
  var b = s.split('')
  for (var i = 0, iLen = b.length; i < iLen; i++) {
    b[i] = 1 - b[i];
  }
  return b.join('');
}

// Tests
console.log('Ed 3 version');
var data = ['0', '010', '110', '10011100110'];
for (var i = 0, iLen = data.length; i < iLen; i++) {
  console.log(data[i] + ' ->\n' + flipStringBitsEd3(data[i]) + '\n');
}
&#13;
&#13;
&#13;

适用于任何长度的字符串。 ed 3版本可以在任何地方使用,并且可能比使用更新功能的函数更快。

答案 4 :(得分:0)

您可以将String.prototype.replace()RegExp /(0)|(1)/

一起使用

&#13;
&#13;
function toggle(n) {
  return n.replace(/(0)|(1)/g, function(m, p1, p2) { return p2 ? 0 : 1 });
}
    
console.log(
  toggle("10100"),
  toggle("101")  
)
&#13;
&#13;
&#13;

答案 5 :(得分:0)

您可以为数字的宽度创建掩码,并使用xor来翻转位。

/**
 * @param {number} num
 * @return {number}
 */
var findComplement = function(num) {
    let len = num.toString(2).length;
    let mask = Math.pow(2, len) - 1;
    return num ^ mask;
};
console.log(findComplement(5));

答案 6 :(得分:0)

对于整数值,您可以使用 javaScript 程序反转给定整数中位的顺序,结果返回新整数,如下所述:

function binaryReverse(value) {
  return parseInt(value.toString(2).split('').reverse().join(''), 2);
}

console.log(binaryReverse(25));
console.log(binaryReverse(19));

输出:

 19
 25