2012-02-25 13 views

Odpowiedz

56
scala> 3.toBinaryString 
res0: String = 11 

Scala ma niejawna konwersja z Int do RichInt który ma metodę toBinaryString. Ta funkcja nie drukuje początkowych zer.

20

nie wiem bezpośredniej metody API to zrobić, ale tutaj jest jeden sposób to zrobić:

def toBinary(i: Int, digits: Int = 8) = 
    String.format("%" + digits + "s", i.toBinaryString).replace(' ', '0') 
+1

+1 za dodanie zer ;-) – Jack

+0

@JacobusR Dzięki. Właściwie uważam, że o to prosiliście, ponieważ w swoim pytaniu było całkiem jasne, prosząc o "wbudowany * formatter *", a nie konwerter! –

2

Oto jeszcze jeden sposób (stary Java):

val x = 5 
val str = Integer.toString(x,2) 

Podobnie jak Lauri odpowiedź, to nie drukuje zera.

+0

Ciągle zapominam, że nie ma nic złego w używaniu Javy w Scali – Jack

0

można zrobić coś takiego:

scala> val x = 3 
x: Int = 3 

scala> Integer.toString(x, 2) 
res4: java.lang.String = 11 

jak inne sugestie, to nie ma zer ...

9

8 cyfr dla numeru 3 z wiodącymi zerami:

printf ("%08d", 3.toBinaryString.toInt) 
00000011 

Ponieważ Hosam Aly sugeruje utworzenie ciągu znaków, można to zrobić:

def asNdigitBinary (source: Int, digits: Int): String = { 
    val l: java.lang.Long = source.toBinaryString.toLong 
    String.format ("%0" + digits + "d", l) } 

W ogólnym przypadku, przy użyciu długi jest bardziej odpowiedni, ponieważ wartości binarne się długo bardzo szybko:

scala> asNdigitBinary (1024*512-1, 32) 
res23: String = 00000000000001111111111111111111 

więc miej to na uwadze - selfmade, rekurencyjnej podejście, które generuje cyfra po cyfrze i wypełnia je w końcu byłby łatwo przystosowany do obsługi dowolnych wartości BigInt.

def toBinDigits (bi: BigInt): String = { 
    if (bi == 0) "0" else toBinDigits (bi /2) + (bi % 2)} 

def fillBinary (bi: BigInt, len: Int) = { 
    val s = toBinDigits (bi) 
    if (s.length >= len) s 
    else (List.fill (len-s.length) ("0")).mkString ("") + s 
} 

Byłoby miło, jeśli

def asNdigitBinary (source: Int, digits: Int): String = { 
    val l = BigInt (source.toBinaryString.toLong) 
    String.format ("%0" + digits + "d", l)} 

będzie działać, ale "% 0Nd" nie pasuje do cyfr BigInt. Może powinien zostać zgłoszony błąd? Ale do Scali czy Javy?

+0

Jest to dobra odpowiedź, z wyjątkiem tego, że drukuje wynik, zamiast przechowywać go w użytecznej zmiennej. Możesz spróbować tego zamiast: 'String.format ("% 08d ", 3.toBinaryString.toInt.asInstanceOf [Object])' –

+0

@HosamAly: 'Na przykład, aby wydrukować: 00000011 dla wartości Int 3. ' –

+0

Dobrze łapać. :) Niemniej jednak warto byłoby dodać ogólną wersję do swojej odpowiedzi. Dodałbym go do mojego, ale uważam, że to twój pomysł. –

1

To drukowanie zer:

def int2bin(i: Int, numPos: Int): String = { 
    def nextPow2(i: Int, acc: Int): Int = if (i < acc) acc else nextPow2(i, 2 * acc) 
    (nextPow2(i, math.pow(2,numPos).toInt)+i).toBinaryString.substring(1) 
    } 
0

Zwykle używam do poprzedzić zer o długości poszukiwanych -1 a potem po prostu posiekać n ostatnich znaków:

"0000000" + 3.toBinaryString takeRight 8 

Działa to dobrze dla ujemny również wartości.