Comment écrire des littéraux binaires dans Scala?

Scala a un support direct pour l'utilisation des nombres hexadécimaux et octaux:

scala> 01267 + 0100
res1: Int = 759

scala> 0x12AF + 0x100
res2: Int = 5039

Mais comment exprimez-vous un entier en tant que nombre binaire dans Scala ?.

23
demandé sur Jacek Laskowski 2011-08-26 01:01:40

6 réponses

Si la performance n'est pas un problème, vous pouvez utiliser une chaîne et la convertir en entier.

val x = Integer.parseInt("01010101", 2)

Les nombres binaires ne sont pas pris en charge directement en partie parce que vous pouvez facilement convertir de l'hexadécimal en binaire et vice versa. Pour rendre votre code plus clair, vous pouvez mettre le nombre binaire dans un commentaire.

val x = 0x55 //01010101
22
répondu Kim Stebel 2011-08-25 21:19:23

Dans 2.10, vous pouvez créer un interpolateur de chaîne pour cela, par exemple il est possible d'écrire b"0010" pour signifier 2. En utilisant des macros, vous pouvez vous débarrasser de la surcharge d'exécution associée et effectuer la conversion au moment de la compilation. Jetez un oeil à macrocosm de Jason Zaugg pour le voir en action:

scala> b"101010"
res4: Int = 42

scala> b"102"
<console>:11: error: exception during macro expansion: invalid binary literal
              b"102"
              ^
18
répondu Eugene Burmako 2013-02-02 14:27:23

En utilisant les nouveaux mécanismes "implicit class" et "value class" dans 2.10, vous pouvez écrire quelque chose comme ceci pour ajouter des méthodes de commodité sans la surcharge de la création d'objets:

implicit class IntToBase( val digits:String ) extends AnyVal {
  def base(b:Int) = Integer.parseInt( digits, b )
  def b = base(2)
  def o = base(8)
  def x = base(16)
}

Cela vous permet de faire des choses comme

"555".o  // 365 decimal

Et aucun objet IntToBase n'est réellement créé.

8
répondu AmigoNico 2013-02-09 20:44:40

Vous devez faire attention si vous convertissez à partir d'un entier qui "ressemble" au binaire comme le suggère @agilesteel. Par exemple, 0101.b essaierait de convertir 65 décimales en binaire (0 initial signifiant octal), alors que 101.b essaierait de convertir 101 décimales en binaire. Cela n'a vraiment de sens que d'essayer de convertir d'une chaîne, pour laquelle il y a Integer.parseInt, et d'un nombre à la représentation de chaîne binaire, pour laquelle il y a Integer.toString(x, 2).

Je ne peux pas penser à trop de cas d'utilisation pour littéraux binaires programmatiques. Cela dit, ils ont fait à Java 7 {[9] } comme un nombre avec le préfixe 0b, donc je serais surpris s'ils n'apparaissaient pas bientôt dans Scala. Java semble avoir bien fait sans eux pendant 15 ans.

6
répondu Luigi Plinge 2011-08-26 00:21:20

Si vous prévoyez de l'utiliser beaucoup, vous pouvez simuler le comportement avec une conversion implicite.

object Extensions {
  implicit def conversion(x: Int) = new BinaryInt(x)
  class BinaryInt(x: Int) {
    def b = {
      // Conversion code like Integer.parseInt
      // as Kim suggested
    }
  }
}

Maintenant, vous pouvez faire des choses comme

import Extensions._
val x = 0101.b
// or
val x = 5.b

Vous devez décider par vous-même, dans quelle direction la conversion devrait aller.

4
répondu agilesteel 2011-08-25 21:52:22

Si vous voulez obtenir une chaîne de la représentation binaire D'Un Int, vous pouvez appeler 4.toBinaryString. Le rembourrage est plus difficile. Vous devrez faire quelque chose comme: 4.toBinaryString.reverse.padTo(8, "0").reverse.mkString

1
répondu ehrt1974 2017-03-24 13:49:41