9
votes

Inverser une valeur binaire d'un nombre

Je voudrais d'abord convertir un nombre en binaire, puis inverser le bitwise. Comme ceci:

numéro est 793 = 1100011001 code> Ensuite, convertissez la valeur binaire en: 0011100110 code> p>

dans JavaScript, je peux faire ce qui suit: p>

p>

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


1 commentaires

Je suppose avec 793 ^ -1 Vous obtiendrez la valeur inversée des bits d'un quelconque numéro, utilisez simplement l'opérateur ^ avec l'opérande gauche sous forme -1


6 Réponses :


-1
votes

Mise à jour forte>

On ne peut pas préciser si vous voulez une chaîne de valeur inversée, si vous pouvez le faire: P>

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'


4 commentaires

Je ne comprends pas comment cela répond à la question, car Xoring avec 0 fait pas change de bits, comme vous l'avez démontré.


@Greg Ah, décollement du cerveau désolé copié les mauvais trucs de ma coquille, allez le réparer


Xor'ing un élément avec 0 ne fait rien


Désolé, manque de sommeil: / mises à jour la réponse.



4
votes

Vous voulez xor la valeur binaire avec 111111111 - mais plusieurs 1s comme il y a des chiffres dans l'original. Donc:

var x = 793;
var result = parseInt(x.toString(2).replace(/[01]/g,function(n) {return 1-n;}),2);


2 commentaires

Vous pouvez également enregistrer ceci est une fonction prototype, si vous allez l'utiliser beaucoup: numéro.pototype.negate = fonction () {renvoie cette ^ parseint ((nouveau tableau (this.tostring (2). longueur + 1)). Joindre ("1"), 2);}; - De cette façon, vous pouvez avoir var x = 793; var c = x.negate ();


Bon Dieu, tout ce string muning n'est pas très dans l'esprit des opérations bitwises, n'est-ce pas? Vous pouvez aussi le faire comme 793..Tostring (2) .replace (/ 1 / g, 'a'). Remplacez (/ 0 / g, '1'). Remplacez (/ A / g, '0 ') mais vous causeriez probablement un 6502 CPU quelque part de fondre.



10
votes

Vous devez utiliser un masque de bit. xxx

ou avec xor xxx


0 commentaires

11
votes

La réponse de Moogoo est correcte.

Voici quelques informations sur ce qui se passe ... Permet de supposer qu'il s'agit d'un entier 64 bits. P>

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


1 commentaires

Peu importe, si je me souviens bien de tout ce que JavaScript est 64 bits sous les couvertures. Le résultat que c'est 32 bits ou 64 bits sera la même valeur, peu importe. Je viens d'utiliser 64 bits afin que je puisse démontrer quelle était la valeur négative en binaire. Depuis que le "-" n'existe pas en binaire, mais JavaScript tente d'être gentil quand il montre le signe négatif sur le nombre. Cela a-t-il du sens? Je ne suis pas si génial de l'expliquer. La différence avec la solution que j'ai affichée est que c'est tout mathématique. La pièce Y et YL peut également être simplifiée, je n'ai tout simplement pas le temps d'y arriver



0
votes

Je viens de faire cela

disons x = -11.3 et c'est un entier 16 bits de quelque part. p>

Mes résultats entreront dans la variable r. P>

var r = ((x & 0x7FFF) ^ 0x7FFF)+1;


1 commentaires

Comment -11.3 un entier?



0
votes

Pas le code le plus court mais plus lisible. Ma technique est similaire à @IVo Wetzel :

p>

const bitwiseComplement = (N) => {
  return N.toString(2).replace(/[0-1]/g, (v) => (v == 1 ? 0 : 1));
};

console.log(bitwiseComplement(793));


0 commentaires