2014-10-03 105 views
32

如何將Int轉換爲Swift中的UInt8? 示例。我想如果你想binary擁有的22價值數22轉換爲0b00010110如何在Swift中將十進制數轉換爲二進制數?

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

號就沒有底座,直至要顯示他們。 – Kevin 2014-10-03 14:49:11

+0

'var decimal = 22;'即它是一個二進制數字'1 *(2^4)+ 1 *(2^2)+ 1 * 2'; – 2014-10-03 14:59:57

+0

你的問題(基於評論)實際上是:「我如何快速XOR字節?」 – 2014-10-03 15:01:08

回答

78

您可以使用String初始化,需要一個radix參數十進制值轉換爲人類可讀的二進制表示

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

如果你願意,你也可以與任意數量的填充它零很容易地以及:

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

我需要UInt8中的一個數字。我想使用字節。 XOR示例: – subdan 2014-10-03 14:53:52

+0

如果您想將現有的「Int」轉換爲「UInt8」類型,您可以簡單地使用'UInt8()'初始化程序,並傳入「Int」類型。或者,如果您想直接分配一個'UInt8'變量,請使用'let myBits = 0b00010110'提前知道該值。 – 2014-10-03 14:56:38

+0

謝謝!它幫助了我。我怎樣才能println(UInt8)?我想看到字節,而不是十進制值。 – subdan 2014-10-03 15:00:54

3

,只是爲其分配一個:binary = 22或者你可以把它寫成binary = 0b00010110;這兩個陳述是等同的。

0

我修改了版本雨燕2.0計數的字符串,並增加了長度檢查:

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

我同意其他人,雖然for循環似乎是多餘的重複一個字符。
我們可以簡單地用下面的字符串初始化器去:

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

使用示例:

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

這是一個完整的例子:

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

這是我會怎麼做:

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似乎已經不可用 – 2016-09-14 11:23:45

+0

什麼是不可用? – Alexander 2016-09-14 16:15:51

2

我修改別人的版本SWIFT 3.0使用正確的初始化與重複值

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

創建一個字符串有二進制和十進制的數字系統之間沒有區別,當你與變量的工作,直到你想可視化他們或者如果你想轉換可以容納不同位數的類型。

你的情況,就足以寫出

var decimal = 22 
var binary = UInt8(decimal) 

但是,這將崩潰(溢出發生)如果decimal將持有的值超過255,因爲它是UInt8可容納最大值。

取決於你想要達到的目標,你可以寫

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

你會得到0結果,因爲這將初始化截斷少顯著位。

第二個選項是

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

這個初始化返回nil結果,而不是崩潰,如果溢出發生。

P.S.如果你想看到二進制字符串表示使用

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

UInt8(十進制)和UInt8(確切地說:不生成二進制表示,TruncatingBitPattern不可用。 – ScottyBlades 2017-09-20 18:46:17

1

所以我最近這個問題出現了。由於各種問題,其他通用解決方案對我無效。總之,這裏是我的解決方案(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)) 
    } 
    } 
} 

測試:

// 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) 
相關問題