2009-09-22 13 views
3

var d = 7;Définition de bits spécifiques dans un nombre

en binaire: 7 = (111)

Ce que je veux faire est de mettre la deuxième place de droite à 1 ou 0 à disposition,

et retourner la valeur décimale.

Par exemple, si je veux faire la deuxième 1 à 0, puis après une procédure doit retourner un 5,

parce que 5 = (101).

Comment implémenter cela en javascript?

EDIT

la réponse devrait être quelque chose comme ceci:

function func(decimal,n_from_right,zero_or_one) 
{ 

} 

Où décimal est le nombre à traiter, n_from_right est combien de bits de droite, dans mon exemple ci-dessus sont 2 zero_or_one signifie mettre ce bit spécifique à 0 ou 1 à disposition.

Répondre

14

La manière la plus simple d'effacer un bit est d'utiliser l'opération et avec son complément de bits.

7 = 0000000000000111 
~2 = 1111111111111101 
& : 0000000000000101 

Dans le code:

var d = 7, mask = 2; 
d &= ~mask; 

Pour définir un peu au lieu de l'effacer, vous utilisez l'opérateur à la place:

d |= mask; 

Si vous devez créer le masque dynamique pour gérer différents bits, vous commencez par la valeur un (binaire 0000000000000001) et déplacez le bit vers l'index correct. Le second bit est d'indice one (le bit le plus à droite est d'indice zéro), alors:

var index = 1; 
var mask = 1 << index; 
+0

+1 - bonne réponse, bien expliqué –

+0

Suis-je un malentendu? '~ 2! == parseInt (" 1111111111111101 ", 2)' –

+0

@MichaelTheriot: J'ai simplifié un peu dans la réponse, les opérateurs bit à bit fonctionne sur les nombres de 32 bits, donc il devrait être un autre 16 1 pour être précis. Cependant, les nombres ne sont toujours pas les mêmes, car '~ 2' est' -3' et 'parseInt (" 11111111111111111111111111111101 ", 2)' est '4294967293'. Comme les opérateurs bit à bit fonctionnent sur des nombres de 32 bits, et '4294967293' est trop grand pour tenir dans 32 bits, il sera converti en' -3' dans l'opération. (Eh bien, il est vraiment converti en la représentation binaire du nombre, mais il apparaît comme «-3» lorsqu'il est reconverti.) – Guffa

0

essayez d'utiliser opérateurs de bits:

d &~(1<<1) 

voir aussi this docs

10

Une façon de le faire, mais vous seriez probablement mieux en utilisant des opérateurs au niveau du bit

var d = 7; 
var binary = d.toString(2); 

binary = binary.split(''); 
binary[1] = "0"; 
binary = binary.join(''); 
binary = parseInt(binary,2); 
+3

Je suis d'accord arithmétique bitwise c est meilleur, mais +1 pour indiquer la façon relativement peu connue de convertir vers/à partir de chaînes binaires. – bobince

0

Vous pouvez utiliser le Javascript bitwise operators :

var five = 7 & ~2; 

2 = 10 en binaire

+0

Que signifie ~ 2? – omg

+0

~ est bitwise NON - https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Operators/Bitwise_Operators#.7e_%28Bitwise_NOT%29 –

1

Pour définir le second bit, il suffit OU avec deux (10 en binaire)

var d=5; 
var mask=2; 
var second_bit_set=d | mask; 


      d: 101 
     mask: 010 
-------------------- 
bitwise OR: 111 

Pour retirer la deuxième bit, vous voulez ET avec une valeur qui a tous les bits mis à part le second. Un moyen facile de construire cette valeur est d'effectuer NOT au niveau du bit sur la valeur, par ex.~ 2

var d=7; 
var mask=~2; 
var second_bit_unset=d & mask; 

      d: 111 
     mask: 101 
-------------------- 
bitwise AND: 101 

Voir cette bitwise operator reference pour plus d'informations sur ces opérateurs.

0
var str="XXX\tYYYYYYY\n"; 
for(var i=0;i<=7;i++){ 
str+=(i+8).toString(2).substring(1)+"\t"+(i*11+22+128).toString(2).substring(1); 
str+="\n"; 
} 
console.info(str); 

vous pouvez faire un Func mon vélo

1

/** Convertir un nombre décimal en binaire **/

var toBinary = function(decNum){ 
    return parseInt(decNum,10).toString(2); 
} 

/** Convertir un nombre binaire en décimal **/

var toDecimal = function(binary) { 
    return parseInt(binary,2).toString(10); 
}