2012-02-25 27 views

Trả lời

56
scala> 3.toBinaryString 
res0: String = 11 

Scala có một chuyển đổi ngầm từ Int để RichInt trong đó có một phương pháp toBinaryString. Chức năng này không in các số 0 đầu tiên.

20

Tôi không biết của một phương pháp API trực tiếp để làm điều đó, nhưng đây là một cách để làm việc đó:

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

+1 để thêm số không ;-) – Jack

+0

@JacobusR Cảm ơn. Trên thực tế tôi tin rằng đó là những gì bạn hỏi về, kể từ khi bạn đã khá rõ ràng trong câu hỏi của bạn, yêu cầu cho "một built * định dạng *", không phải chuyển đổi! –

2

Dưới đây là một cách tiếp (cũ Java):

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

Cũng giống như Lauri câu trả lời, nó không in hàng đầu zero.

+0

Tôi quên rằng không có gì xấu về việc sử dụng Java trong Scala – Jack

0

Bạn có thể làm một cái gì đó như thế này:

scala> val x = 3 
x: Int = 3 

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

Như với lời đề nghị khác, điều này không có số không hàng đầu ...

9

8 chữ số cho số 3 với số không hàng đầu:

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

Vì Hosam Aly cũng đề xuất tạo một Chuỗi, đây là một phương pháp để làm như vậy:

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

Trong trường hợp tổng quát, sử dụng một Long là thích hợp hơn, vì giá trị nhị phân được dài rất nhanh:

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

Vì vậy, giữ cho rằng trong tâm trí - một cách tiếp cận đệ quy selfmade mà tạo ra chữ số bằng chữ số và điền vào họ cuối cùng sẽ dễ dàng thực hiện để xử lý các giá trị tùy ý của 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 
} 

Nó sẽ được tốt đẹp, nếu

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

sẽ làm việc, nhưng "% 0Nd" không phù hợp cho các số bigint. Có thể yêu cầu tính năng Bugreport/Tính năng? Nhưng với Scala hay Java?

+0

Đây là câu trả lời hay, ngoại trừ việc nó in kết quả thay vì lưu trữ nó trong một biến có thể sử dụng được. Bạn có thể thử thay vào đó: 'String.format ("% 08d ", 3.toBinaryString.toInt.asInstanceOf [Object])' –

+0

@HosamAly: 'Ví dụ: in ra: 00000011 cho giá trị Int 3.' –

+0

Tốt bắt lấy. :) Tuy nhiên, nó sẽ có giá trị để thêm phiên bản chung cho câu trả lời của bạn. Tôi đã thêm nó vào tôi, nhưng tôi tin đó là ý tưởng của bạn. –

1

này sẽ in zero hàng đầu:

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

Tôi thường sử dụng để thêm vào trước zero chiều dài truy nã -1 và sau đó chỉ cần chặt những nhân vật ngoài cùng bên phải:

"0000000" + 3.toBinaryString takeRight 8 

này hoạt động tốt cho tiêu cực giá trị là tốt.

Các vấn đề liên quan