2010-12-02 3 views
5

я хотел бы сначала преобразовать число в двоичный, а затем инвертировать его побитовым .. как это:Javascript инвертирования двоичного значения числа

номер 793 = 1100011001 затем преобразовать в двоичном значение: 0011100110

в JavaScript я могу сделать следующее:

var x = 793; 
document.write(x.toString(2)); // gives 0011100110 

это даст мне двоичное значение числа .. но как я инвертировать двоичный побитовое?

я попробовал оператор ~, но не работает, вероятно, ... выход: -1100011010

любая помощь? заранее спасибо

ответ

0

Update

Неясно мне, хотите ли вы строку перевернутого значения, если так что вы можете сделать это:

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' 

Это также сохранит ведущие нули.

+0

Я не понимаю, как это отвечает на вопрос, потому что XORing с 0 делает ** ** не изменить любой бит, как вы показали. – 2010-12-02 18:24:17

+0

@Greg Ах, мозг отстает, извините, скопировал неправильный материал из моей оболочки, собираюсь исправить его – 2010-12-02 18:27:44

+0

xor'ing элемент с 0 ничего не делает – 6502 2010-12-02 18:38:34

4

Вы хотите 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); 

Я считаю, что это будет более эффективным ... наверное. Может быть, совершенно неправильно. Ну что ж.

5

Вам нужно использовать битовую маску.

(~793 & 0x3ff).toString(2) //11100110 

Или с XOR

793^0x3ff 
8

ответ 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/>"); 
Смежные вопросы