2011-08-25 27 views
21

Scala đã hỗ trợ trực tiếp cho việc sử dụng hex và bát phân số:Làm thế nào để viết các chữ cái nhị phân trong Scala?

scala> 01267 + 0100 
res1: Int = 759 

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

nhưng làm thế nào để bạn bày tỏ một số nguyên như một số nhị phân trong Scala?.

+2

Lưu ý rằng từ 2.10, việc sử dụng số bát phân có nghĩa là 0 hàng đầu sẽ không còn được dùng nữa. – AmigoNico

Trả lời

19

Nếu hiệu suất không phải là một vấn đề, bạn có thể sử dụng một chuỗi và chuyển đổi nó thành một số nguyên.

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

Số nhị phân không được hỗ trợ trực tiếp một phần vì bạn có thể dễ dàng chuyển đổi từ thập lục phân sang nhị phân và ngược lại. Để làm cho mã của bạn rõ ràng hơn, bạn có thể đặt số nhị phân trong một nhận xét.

val x = 0x55 //01010101 
4

Nếu bạn định sử dụng rất nhiều, bạn có thể mô phỏng hành vi bằng chuyển đổi ẩn.

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

Bây giờ bạn có thể làm những thứ như thế

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

Bạn phải quyết định cho chính mình, mà hướng chuyển đổi nên đi.

+4

Hãy cẩn thận: '0101' là số bát phân! – soc

+0

Đến tận 2,10. Xem các bình luận khác. –

6

Bạn sẽ cần phải cẩn thận nếu bạn đang chuyển đổi từ một số nguyên mà "trông giống như" nhị phân như @agilesteel gợi ý. Ví dụ 0101.b sẽ cố gắng chuyển đổi 65 số thập phân thành nhị phân (số 0 có dấu đầu tiên), trong khi 101.b sẽ cố gắng chuyển đổi 101 thập phân sang nhị phân. Nó chỉ thực sự có ý nghĩa để cố gắng chuyển đổi từ một chuỗi, trong đó có Integer.parseInt và từ một số đến biểu diễn chuỗi nhị phân, trong đó có Integer.toString(x, 2).

Tôi không thể nghĩ quá nhiều trường hợp sử dụng cho các chữ nhị phân có lập trình. Điều đó nói rằng, họ đã made it to Java 7 dưới dạng một số có tiền tố 0b, vì vậy tôi sẽ ngạc nhiên nếu họ không xuất hiện trong Scala sớm. Java dường như đã làm tốt mà không có chúng trong 15 năm mặc dù.

+9

Java đã thực hiện "tốt" mà không có ký tự chưa ký hoặc nhà khai thác bitwise khá quá. Bởi "tốt", tôi có nghĩa là mọi người chỉ cần từ bỏ viết những thứ cần thiết trong Java, hoặc người nào khác bị nguyền rủa Java mỗi inch của con đường. –

8

Sử dụng "class ngầm" mới và cơ chế "class giá trị" trong 2.10, bạn có thể viết một cái gì đó như thế này để thêm các phương pháp thuận tiện mà không có sự cần thiết của việc tạo đối tượng:

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

đó cho phép bạn làm những điều như

"555".o // 365 decimal 

và không có đối tượng IntToBase nào được tạo ra thực sự.

18

Trong 2.10 bạn có thể tạo một nội suy chuỗi cho điều đó, ví dụ: bạn có thể viết b"0010" để có nghĩa là 2. Sử dụng macro, bạn có thể loại bỏ chi phí thời gian chạy liên quan và thực hiện chuyển đổi tại thời gian biên dịch. Hãy xem Jason Zaugg của macrocosm để xem nó trong hành động:

scala> b"101010" 
res4: Int = 42 

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

Nếu bạn muốn nhận được một chuỗi của các đại diện nhị phân của một Int bạn có thể gọi 4.toBinaryString. Padding là khó khăn hơn. Bạn sẽ phải thực hiện một số việc như: 4.toBinaryString.reverse.padTo(8, "0").reverse.mkString

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