0
votes

Kotlin décomposant des nombres en puissances de 2

Bonjour, j'écris une application à Kotlin et j'ai besoin de décomposer un nombre en puissances de 2.

Je l'ai déjà fait en C #, PHP et Swift, mais Kotlin fonctionne différemment d'une manière ou d'une autre. p>

avoir Recherché ceci, je crois que c'est quelque chose à voir avec les chiffres de mon code qui se déroulent négatif quelque part et que la solution réside dans la déclaration de la variable "longue" pour empêcher cela de se produire mais je n'ai pas pu comprendre comment Pour ce faire. p>

Voici mon code: P>

1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,-2147483648,


5 commentaires

Pouvez-vous marquer ma réponse comme "acceptée" s'il vous plaît?


Pouvez-vous clarifier ce que vous entendez en disant que vous voulez décomposer un nombre en puissances de 2. Cela signifie-t-il que vous souhaitez écrire le numéro comme la somme des pouvoirs de 2? Ou avez-vous quelque chose d'autre en tête?


Mon système stocke des options choisies pour les aliments commandés dans un système de clic et de collecte, car de nombreuses options peuvent être configurées dans différentes combinaisons chaque permutation est référencée par un numéro de puissance 2, c'est-à-dire 1,2,4,8,16 , 33c, ceux-ci représentent des salades, des options de sauce de remplissage choisies pour la commande, etc. Une fois que tous ces éléments sont choisis, ils sont ensuite stockés comme un seul entiers dans la base de données, la Lettuce-1 Cumumber-4 mayonnaise-16 choisies sont stockées comme valeur 20 Dans la DB, le système nécessite uniquement un seul champ en tant qu'oquet de stocker des options et des performances élevées.


Ok, bien (mais je pense que vous vouliez dire "21" où vous avez écrit "20" ci-dessus, non?). Donc, ce que vous voulez que votre nouvelle fonction est de prendre la valeur 21 et de revenir {1,4,16}, les pouvoirs de 2 que 21 sont "décomposés" dans. Corriger? C'est ce que la "réponse" de votre question rapide, mais ce n'est pas la réponse acceptée pour la fonction Kotlin. La réponse acceptée pour la fonction Kotlin renvoie simplement toutes les puissances de 2 inférieures à la valeur d'entrée. Cela arrive au travail si la valeur est de la forme 2 ^ n-1 mais pas autrement. C'est-à-dire que la réponse kotlin fonctionnera pour l'entrée 127 mais pas 126 ou 129.


Oups Oui 21 Je suis maintenant compris que ma solution de travail est ci-dessous, ce n'est probablement pas la solution la plus élégante, mais cela fonctionne très bien. Si vous devriez suggérer une amélioration dans ce qui serait génial!


4 Réponses :


-1
votes

Vous voulez faire le "Bitwise et" de "valeur" et "Masque" pour déterminer si le J-ème bit de "valeur" est défini. Je pense que vous avez juste oublié ce test dans votre mise en œuvre de Kotlin.


1 commentaires

Curieux pourquoi cela a été évité. Cette recommandation est correcte et c'est exactement ce que l'OP a fait pour faire fonctionner son programme.



0
votes

Ceci fonctionne pour l'une entrée que vous avez spécifiée, à tout le moins:

@Test
fun addition_isCorrect() {

    val result = powersOfTwo(127)

    assertEquals("1,2,4,8,16,32,64", result)
}


3 commentaires

Cela ne va pas travailler pour les valeurs d'entrée de la forme 2 ^ n-1 où n est un entier. Essayez-le pour la valeur = 129 au lieu de 127.


Oui. Une entrée de 129 vous donne une sortie de 1,2,4,8,16,32,64,128 . La déclaration de problème n'indique pas que nous nous soucions des restes. Si nous le faisons, Drewby80 devrait spécifier comment nous nous soucions d'eux.


Drewby80, vous avez posé une question très similaire sur la manière de mettre en œuvre cette même fonctionnalité à Swift. La solution à la question SWIFT fournira des résultats résolument différents de cette mise en œuvre de Kotlin pour toutes les valeurs non du formulaire 2 ^ n-1.



0
votes

Bonjour, j'ai finalement réussi à obtenir cela fonctionne correctement:

fun decomposeByTwo(value :Int): String {

val result = ArrayList<String>()
var value = value
var j = 0
while (j < 256) {

    var mask = 1 shl j
    if ((value and mask) != 0) {
        value -= mask
        result.add(mask.toString())

    }
    j += 1
}

return result.toString()
}


4 commentaires

Je n'ai pas testé cela mais on dirait que cela fonctionnerait. Dans ma réponse initiale, j'ai dit que vous devez et ensemble de la valeur et du masque pour déterminer si le J-ème Bit de valeur est défini, et c'est ce que vous faites maintenant. Notez qu'il n'y a aucune raison pour vous de tester jusqu'à J <256. Kotlin Ints dispose de 32 bits et vous passez de la valeur en tant que INT, vous devez donc juste avoir besoin de tester jusqu'à J <32. Vous voudrez peut-être modifier le type du paramètre "valeur" pour être ulong, ce qui vous donnerait 64 bits.


De plus, votre calcul du masque, comme il est maintenant, va être 0 quand J> 32. "1l shl j" devrait fonctionner pour J <64. Ajoutez une ligne pour imprimer la valeur du masque et J sur chaque itération dès que vous calculez le masque, pour le débogage.


Wow, vous avez accepté votre propre réponse après avoir résolu le problème pour vous. Classe.


Ouais, bien sûr, disons que je n'aurais pas pu l'avoir fait sans toi.



0
votes

Vous pouvez obtenir une liste de tous les pouvoirs de deux qui correspondent à int code> et testez chacun d'eux pour savoir si la valeur contient avec la fonction infixe et code>:

val value = 126

val powersOfTwo = (0 until Int.SIZE_BITS).map { n -> 1 shl n }
println(powersOfTwo.filter { p -> value and p != 0}.joinToString(","))
// prints: 2,4,8,16,32,64


0 commentaires