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

thtygnil  于 2023-06-04  发布在  Java
关注(0)|答案(8)|浏览(223)

例如,10100将被反转为01011; 010将被反转为101; 101将被转换为010。
问题是当我使用~5时,它变成了-6,因为js使用32位有符号。
如何反转无符号任意位二进制数?
我想创建一个函数,它接受这个无符号的任意位二进制数,并返回它的反转形式(101->010)
我想把字符串101转换成010

vsnjm48y

vsnjm48y1#

您可以创建一个函数,像这样翻转所需的位数

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

以上是ES 5中的

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
vfhzx4xs

vfhzx4xs2#

反转位总是相同的,但是要将无符号整数转换为有符号整数,您可以使用unsigned >>>移位运算符来处理无符号数:

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)
rdlzhqv9

rdlzhqv93#

在JavaScript中,~或波浪号可以完成此操作

  • (N+1)
    因此,您当前的操作是正确的,但不是您要查找的:
~5
-(5 + 1)
-6

Reference

uurv41yg

uurv41yg4#

您可以将String.prototype.replace()RegExp/(0)|(1)/一起使用

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

kq4fsx7k5#

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

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))
);

也许有一个混合的按位运算符做同样的事情。

编辑

看起来你正在使用字符串,所以只需拆分,翻转并再次加入:

// 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))
);

ECMAScript艾德3的基本功能(适用于任何地方,甚至IE 4)。

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');
}

适用于任何长度的字符串。艾德3版本将在任何地方工作,并且可能比使用较新功能的函数更快。

uqjltbpv

uqjltbpv6#

您可以为数字的宽度创建一个掩码,并使用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));
8ftvxx2r

8ftvxx2r7#

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

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

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

输出:

19
 25
yrwegjxp

yrwegjxp8#

它接受一个二进制数字串并返回其逆数。如果字符串有前导0,它们也会变成1。

var inverseBin = (bin) => bin.replace(/(0)|(1)/g, (bit) => Number(bit == 0));

相关问题