Инвертирование двоичного значения числа
Я хотел бы сначала преобразовать число в двоичное, а затем инвертировать его поразрядно.
Как это:
Номер 793 = 1100011001
затем преобразовать двоичное значение в: 0011100110
В JavaScript я могу сделать следующее:
var x = 793;
document.write(x.toString(2)); // gives 0011100110
Это даст мне двоичное значение числа.
Но как я могу инвертировать двоичный файл?
Я попытался оператор ~, но, вероятно, не работает... Выход: -1100011010
Ответы
Ответ 1
Ответ MooGoo правильный.
Вот некоторая информация о том, что происходит.... Предположим, что это 64-битное целое число.
793 = 1100011001
~793 = -794 = 1111111111111111111111111111111111111111111111111111110011100110
0x3ff = 1111111111
(-793 & 0x3ff) = 11100110
Итак, вы можете сделать это, чтобы решить для всех случаев с помощью этого кода:
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/>");
Ответ 2
Вам нужно использовать битовую маску.
(~793 & 0x3ff).toString(2) //11100110
Или с помощью XOR
793 ^ 0x3ff
Ответ 3
Вы хотите XOR двоичное значение с 111111111 - однако много 1s, поскольку в оригинале есть цифры. Итак:
var x = 793;
var result = x ^ parseInt((new Array(x.toString(2).length+1)).join("1"),2);
(Код для str_repeat, взятый из PHP.JS)
Повторяя годы спустя, попробуйте:
var x = 793;
var result = parseInt(x.toString(2).replace(/[01]/g,function(n) {return 1-n;}),2);
Я считаю, что это будет более эффективно... возможно. Может быть, совершенно неправильно. О, хорошо.
Ответ 4
Я просто делаю это
Пусть, скажем, x = -11.3 и это 16-битное целое число откуда-то.
Мои результаты войдут в переменную r.
var r = ((x & 0x7FFF) ^ 0x7FFF)+1;
Это принцип поцелуя.
Ответ 5
Обновить
Мне непонятно, хотите ли вы строку инвертированного значения, если вы это сделаете:
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'
Это также сохранит ведущие нули.