2011-08-25 18 views
21

Scala tiene un apoyo directo para el uso de los números hexadecimales y octales:Cómo escribir literales binarios en Scala?

scala> 01267 + 0100 
res1: Int = 759 

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

pero ¿cómo se hace expresar un entero como un número binario en Scala?.

+2

Tenga en cuenta que a partir de 2.10, el uso de un octal de 0 a la media es obsoleto. – AmigoNico

Respuesta

19

Si el rendimiento no es un problema, puede utilizar un String y convertirlo en un entero.

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

números binarios no son compatibles directamente, en parte, porque se puede convertir fácilmente de hexadecimal a binario y viceversa. Para hacer su código más claro, puede poner el número binario en un comentario.

val x = 0x55 //01010101 
4

Si piensa utilizarlo mucho, puede simular el comportamiento con una conversión implícita.

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

Ahora puede hacer cosas como

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

Usted tiene que decidir por sí mismo, en qué dirección debe ir la conversión.

+4

Tenga cuidado: '0101' es un número octal! – soc

+0

Fue hasta 2.10. Ver los otros comentarios –

6

Tendría que tener cuidado si está convirtiendo desde un número entero que parece "binario" como sugiere @agilesteel. Por ejemplo, 0101.b intentaría convertir 65 decimales a binarios (0 inicial significando octal), mientras que 101.b intentaría convertir 101 decimales a binarios. Solo tiene sentido intentar convertir de una Cadena, para la cual hay Integer.parseInt, y de un número a la representación de Cadena binaria, para la cual hay Integer.toString(x, 2).

No puedo pensar en demasiados casos de uso para literales binarios programáticos. Dicho esto, tienen made it to Java 7 como número con el prefijo 0b, por lo que me sorprendería que no aparecieran pronto en Scala. Sin embargo, Java parece haber funcionado bien sin ellos durante 15 años.

+9

Java lo ha hecho "bien" sin caracteres sin signo u operadores bit a bit decentes también. Por "bien", me refiero a que la gente simplemente se da por vencida escribiendo cosas que necesitan eso en Java, o si no, maldita Java cada centímetro del camino. –

8

Utilizando la nueva "clase implícita" y mecanismos de "Valor" en 2.10, se puede escribir algo como esto para agregar métodos de conveniencia sin el añadido de la creación de objetos:

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) 
} 

Eso le permite hacer cosas como

"555".o // 365 decimal 

y nunca se ha creado realmente el objeto IntToBase.

18

En 2.10 puede crear un interpolador de cadenas para eso, p. es posible escribir b"0010" para indicar 2. Al usar macros puede deshacerse de la sobrecarga de tiempo de ejecución asociada y realizar la conversión en tiempo de compilación. Echar un vistazo a Jason Zaugg de macrocosm a verlo en acción:

scala> b"101010" 
res4: Int = 42 

scala> b"102" 
<console>:11: error: exception during macro expansion: invalid binary literal 
       b"102" 
      ^
0

Si desea obtener una cadena de la representación binaria de un Int puede llamar 4.toBinaryString. El relleno es más difícil. Tendrá que hacer algo como: 4.toBinaryString.reverse.padTo(8, "0").reverse.mkString

Cuestiones relacionadas