如何在Swift中将Int转换为UInt8?例.我想将22号转换为0b00010110
var decimal = 22
var binary:UInt8 = ??? //What should I write here?
Run Code Online (Sandbox Code Playgroud)
Cra*_*tis 129
您可以使用带参数的初始化程序将十进制值转换为人类可读的二进制表示:Stringradix
let num = 22
let str = String(num, radix: 2)
print(str) // prints "10110"
Run Code Online (Sandbox Code Playgroud)
如果你愿意,你也可以很容易地用任意数量的零填充它:
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
Run Code Online (Sandbox Code Playgroud)
我将某人的版本修改为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"
Run Code Online (Sandbox Code Playgroud)
由于没有一个解决方案考虑负数,我想出了一个简单的解决方案,它基本上读取数字的内部表示并将其自动填充到其类型的宽度。这应该适用于所有BinaryInteger类型。
extension BinaryInteger {
var binaryDescription: String {
var binaryString = ""
var internalNumber = self
for _ in (1...self.bitWidth) {
binaryString.insert(contentsOf: "\(internalNumber & 1)", at: binaryString.startIndex)
internalNumber >>= 1
}
return "0b" + binaryString
}
}
Run Code Online (Sandbox Code Playgroud)
例子:
UInt8(22).binaryDescription // "0b00010110"
Int8(60).binaryDescription // "0b00111100"
Int8(-60).binaryDescription // "0b11000100"
Int16(255).binaryDescription // "0b0000000011111111"
Int16(-255).binaryDescription // "0b1111111100000001"
Run Code Online (Sandbox Code Playgroud)
我同意其他人的看法,尽管 for 循环对于重复字符似乎是多余的。
我们可以简单地使用以下字符串初始化程序:
init(count count: Int, repeatedValue c: Character)
Run Code Online (Sandbox Code Playgroud)
用法示例:
let string = String(count: 5, repeatedValue: char)
Run Code Online (Sandbox Code Playgroud)
这是一个完整的例子:
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)
Run Code Online (Sandbox Code Playgroud)
在这篇文章leadingZeroBitCount上看了很多答案,但我想知道为什么没有人提到FixedWidthInteger 上的 API
这将返回特定 UInt 中的零数,例如:
UInt(4).leadingZeroBitCount //61
UInt16(4).leadingZeroBitCount //13
Run Code Online (Sandbox Code Playgroud)
迅捷版
4.1
Run Code Online (Sandbox Code Playgroud)
用法
let strFive = String.binaryRepresentation(of: UInt8(5))
print(strFive) // Prints: 00000101
Run Code Online (Sandbox Code Playgroud)
在引擎盖下
extension String {
static func binaryRepresentation<F: FixedWidthInteger>(of val: F) -> String {
let binaryString = String(val, radix: 2)
if val.leadingZeroBitCount > 0 {
return String(repeating: "0", count: val.leadingZeroBitCount) + binaryString
}
return binaryString
}
}
Run Code Online (Sandbox Code Playgroud)
Swift 5 / Xcode 10.2
由于古斯塔沃·塞德勒。我的解决方案版本以可读性为补充。
extension BinaryInteger {
var binaryDescription: String {
var binaryString = ""
var internalNumber = self
var counter = 0
for _ in (1...self.bitWidth) {
binaryString.insert(contentsOf: "\(internalNumber & 1)", at: binaryString.startIndex)
internalNumber >>= 1
counter += 1
if counter % 4 == 0 {
binaryString.insert(contentsOf: " ", at: binaryString.startIndex)
}
}
return binaryString
}
}
Run Code Online (Sandbox Code Playgroud)
例子:
UInt8(9).binaryDescription // "0000 1001"
Int8(5).binaryDescription // "0000 0101"
UInt16(1945).binaryDescription // "0000 0111 1001 1001"
Int16(14).binaryDescription // "0000 0000 0000 1110"
Int32(6).binaryDescription // "0000 0000 0000 0000 0000 0000 0000 0110"
UInt32(2018).binaryDescription // "0000 0000 0000 0000 0000 0111 1110 0010"
Run Code Online (Sandbox Code Playgroud)