2016-11-20 2 views
1

Je voudrais déplacer ce nombre non signé: 1479636484000 7 bits vers la droite. Est-ce possible en JavaScript?JavaScript bit-shifting

deux

1479636484000 >> 7 

et

1479636484000 >>> 7 

renvoie une réponse incorrecte (pour moi). La réponse correcte devrait être 11559660031. Je suppose qu'il y a un peu de signe impliqué ici, et peut-être que le nombre est trop grand pour être supporté. Mais y a-t-il une façon intelligente de contourner le problème?

+0

Oui, les changements sont possibles au niveau du bit à JS, voir https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators. Bien que je ne sois pas sûr s'il y a une certaine syntaxe pour décaler un nombre x de bits. En fait, je n'ai jamais utilisé cette fonctionnalité. –

+0

Copie possible de [Comment faire ET au javascript bit à bit sur les variables de plus de 32 bits?] (Http://stackoverflow.com/questions/3637702/how-to-do-bitwise-and-in-javascript-on -variables-that-are-plus-que-32-bit) – SeinopSys

+0

Je ne pense pas que ce soit un doublon comme c'est la division et non et. La réponse ci-dessous ne s'applique pas au bitwise et aux solutions ... – HelloWorld

Répondre

1

Les opérations au niveau du bit dans JavaScript commencent par tronquer le nombre à un entier de 32 bits. Vos chiffres sont trop gros. La "manière intelligente" de contourner cette limitation est d'implémenter votre propre bibliothèque numérique.

Notez que la division en virgule flottante par 128 vous donne la bonne réponse (si vous supprimez la fraction).

+0

~~ (n/128) ne fonctionne pas. Math.trunc (n/128) devrait fonctionner, mais je n'ai pas ECMA 6, donc cela ne m'aide pas. Cependant, n/128 - n/128% 1 fonctionne! Merci :) – HelloWorld

+0

Vous aurez exactement le même problème avec l'opérateur '~' qu'avec les opérateurs de décalage de bits - ils effectuent la même troncature de 32 bits. 'Math.floor()' laissera la fraction d'une valeur à virgule flottante cependant. – Pointy

1

Vous pouvez utiliser une chaîne avec le numéro et supprimer les 7 derniers caractères et le convertir en un nombre.

console.log((1479636484000).toString(2)); 
 
console.log((11559660031).toString(2)); 
 
console.log((1479636484000).toString(2).slice(0, -7)); 
 
console.log(parseInt((1479636484000).toString(2).slice(0, -7), 2));

+0

Intéressant, mais je suis allé pour n/128 - n/128% 1 :) – HelloWorld