2014-10-03 23 views
32

Làm cách nào để chuyển đổi Int thành UInt8 trong Swift? Ví dụ. Tôi muốn chuyển đổi số 22 đến 0b00010110Làm thế nào để chuyển đổi một số thập phân thành nhị phân trong Swift?

var decimal = 22 
var binary:UInt8 = ??? //What should I write here? 
+11

số không có cơ sở cho đến khi bạn muốn hiển thị chúng. – Kevin

+0

'var decimal = 22;' có nghĩa là số nhị phân '1 * (2^4) + 1 * (2^2) + 1 * 2'; –

+0

Câu hỏi của bạn (dựa trên nhận xét) thực sự là: "làm cách nào để XOR byte nhanh chóng?" –

Trả lời

78

Bạn có thể chuyển đổi các giá trị thập phân cho một con người có thể đọc được nhị phân đại diện sử dụng initializer String mà phải mất một tham số radix:

let num = 22 
let str = String(num, radix: 2) 
print(str) // prints "10110" 

Nếu bạn muốn, bạn cũng có thể pad nó với bất kỳ số lượng zero khá dễ dàng cũng như:

func pad(string : String, toSize: Int) -> String { 
    var padded = string 
    for _ in 0..<(toSize - string.characters.count) { 
    padded = "0" + padded 
    } 
    return padded 
} 

let num = 22 
let str = String(num, radix: 2) 
print(str) // 10110 
pad(string: str, toSize: 8) // 00010110 
+0

Tôi cần một số trong UInt8. Tôi muốn làm việc với byte. Ví dụ để tạo XOR: – subdan

+0

Bạn có thể chỉ cần sử dụng trình khởi tạo 'UInt8()', và truyền vào kiểu 'Int', nếu bạn muốn chuyển đổi một' Int' thành 'UInt8'. Hoặc nếu bạn muốn gán trực tiếp biến 'UInt8', biết giá trị trước thời hạn, sử dụng' let myBits = 0b00010110'. –

+0

Cảm ơn! Nó đã giúp đỡ tôi. Làm thế nào tôi có thể println (UInt8)? Tôi muốn xem các byte thay vì giá trị thập phân. – subdan

3

Nếu bạn muốn binary có giá trị của 22, chỉ cần gán nó rằng: binary = 22 hoặc bạn có thể viết nó như binary = 0b00010110; hai câu lệnh tương đương nhau.

0

tôi sửa đổi phiên bản của bạn để Swift 2.0 đếm trên dây và thêm một tấm séc dài:

extension String { 
func pad(length: Int) -> String { 
    let diff = length - self.characters.count 
    if diff > 0 { 
     var padded = self 
     for _ in 0..<diff { 
      padded = "0" + padded 
     } 
     return padded 
    } else { 
     return self 
    } 
} 
} 
3

Tôi đồng ý với những người khác, Mặc dù vòng lặp for dường như không cần thiết để lặp lại một ký tự.
chúng tôi chỉ đơn giản là có thể đi với những điều sau chuỗi initialiser:

init(count count: Int, repeatedValue c: Character) 

sử dụng ví dụ:

let string = String(count: 5, repeatedValue: char) 

Đây là một ví dụ đầy đủ:

let someBits: UInt8 = 0b00001110 
let str = String(someBits, radix:2) //binary base 
let padd = String(count: (8 - str.characters.count), repeatedValue: Character("0")) //repeat a character 
print(padd + str) 
2

Đây là cách tôi sẽ làm điều đó:

extension String { 
    public func pad(with padding: Character, toLength length: Int) -> String { 
     let paddingWidth = length - self.characters.count 
     guard 0 < paddingWidth else { return self } 

     return String(repeating: padding, count: paddingWidth) + self 
    } 
} 

String(0b1010, radix: 2).pad(with: "0", toLength: 8) //00001010 
+0

hm có vẻ như không có sẵn –

+0

Tính năng nào không khả dụng? – Alexander

2

tôi sửa đổi phiên bản của một ai đó để nhanh chóng 3.0 sử dụng initializer đúng để tạo một chuỗi với các giá trị lặp đi lặp lại

extension String { 
    func pad(with character: String, toLength length: Int) -> String { 
     let padCount = length - self.characters.count 
     guard padCount > 0 else { return self } 

     return String(repeating: character, count: padCount) + self 
    } 
} 

String(37, radix: 2).pad(with: "0", toLength: 8) // "00100101" 
0

Không có sự khác biệt giữa các hệ thống số nhị phân và thập phân, khi bạn đang làm việc với các biến cho đến khi bạn muốn hình dung chúng hoặc nếu bạn muốn chuyển đổi các loại có thể chứa số lượng bit khác nhau.

Trong trường hợp của bạn là đủ để viết

var decimal = 22 
var binary = UInt8(decimal) 

Nhưng điều này sẽ sụp đổ (tràn xảy ra) nếu decimal sẽ tổ chức một giá trị hơn 255, vì nó là giá trị lớn nhất mà UInt8 có thể giữ.

Tùy thuộc vào những gì bạn muốn đạt được bạn có thể viết

var decimal = 261 // 0b100000101 
var binary = UInt8(truncatingBitPattern: decimal) // 0b00000101 

Bạn sẽ nhận được 0 kết quả là, vì khởi tạo này sẽ truncate bit ít quan trọng.

tùy chọn thứ hai là

var decimal = 256 // 0b100000000 
var binary = UInt8(exactly: decimal) // nil 

initializer này trả nil kết quả thay vì đâm, nếu tràn xảy ra.

P.S. Nếu bạn muốn xem biểu diễn chuỗi nhị phân, hãy sử dụng

String(decimal, radix: 2) 
String(binary, radix: 2) 
+1

UInt8 (thập phân) và UInt8 (chính xác: không tạo ra các biểu diễn nhị phân. TruncatingBitPattern không có sẵn. – ScottyBlades

1

Vì vậy, tôi có điều này xuất hiện gần đây. Các giải pháp chung khác không phù hợp với tôi, do nhiều vấn đề khác nhau. Dù sao, đây là giải pháp của tôi (Swift 4):

extension String { 
    init<B: FixedWidthInteger>(fullBinary value: B) { 
    self = value.words.reduce(into: "") { 
     $0.append(contentsOf: repeatElement("0", count: $1.leadingZeroBitCount)) 
     $0.append(String($1, radix: 2)) 
    } 
    } 
} 

Các xét nghiệm:

// result: 0000000000000000000000000000000000000000000000000000000000001001 
String(fullBinary: 9) 
// result: 1111111111111111111111111111111111111111111111111111111100000000 
String(fullBinary: -256) 

// result: 1111111111111111111111111111111111111111111111111101100011110001 
String(fullBinary: -9999) 
// result: 0000000000000000000000000000000000000000000000000010011100001111 
String(fullBinary: 9999) 

// result: 1100011000000000000000000000000000000000000011110110100110110101 
String(fullBinary: 14267403619510741429 as UInt) 
Các vấn đề liên quan