如何在Swift中将十进制数转换为二进制?

时间:2014-10-03 14:47:49

标签: swift

如何在Swift中将Int转换为UInt8? 例。我想将22号转换为0b00010110

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

13 个答案:

答案 0 :(得分:116)

您可以使用带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

答案 1 :(得分:5)

我将某人的版本修改为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"

答案 2 :(得分:4)

我同意其他人的观点,虽然for循环对于重复一个角色来说似乎是多余的 我们可以简单地使用以下String初始化器:

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)

答案 3 :(得分:3)

如果您希望binary的值为22,请将其指定为binary = 22,或者您可以将其写为binary = 0b00010110;这两个陈述是等价的。

答案 4 :(得分:3)

我将如何做到这一点:

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

答案 5 :(得分:3)

迅速4.1

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

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


extension UInt8 {
     public func toBits() -> String
     {
          let a = String( self, radix : 2 )
          let b = a.pad(with: "0", toLength: 8)
          return b
     }
}

func showBits( _ list: [UInt8] )
{
    for num in list
    {
        showBits(num)
    }
}

func showBits( _ num: UInt8 )
{
    //print(num, String( num, radix : 2 ))
    print( "\(num) \t" +   num.toBits())
}

let initialBits :UInt8 = 0b00001111
let invertedBits = ~initialBits
showBits( [initialBits, invertedBits] )

结果

15 00001111

240 11110000

对你有好处〜

答案 6 :(得分:2)

所以我最近出现了这个问题。由于各种问题,其他通用解决方案对我不起作用。无论如何,这是我的解决方案(Swift 4):

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

试验:

[routerLink]

答案 7 :(得分:2)

由于所有解决方案都没有考虑负数,因此我想出了一个简单的解决方案,该解决方案基本上可以读取数字的内部表示并将其自动填充到其类型的宽度。这应该适用于所有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
    }
}

示例:

UInt8(22).binaryDescription     // "0b00010110"
Int8(60).binaryDescription      // "0b00111100"
Int8(-60).binaryDescription     // "0b11000100"
Int16(255).binaryDescription    // "0b0000000011111111"
Int16(-255).binaryDescription   // "0b1111111100000001"

答案 8 :(得分:2)

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

示例:

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"

答案 9 :(得分:0)

我将你的版本修改为字符串上的Swift 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
    }
 }
}

答案 10 :(得分: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)

答案 11 :(得分:0)

本文中回答了很多,但我想知道为什么没有人在Fi​​xedWidthInteger上提到API leadingZeroBitCount

这将返回特定UInt中的零个数 例如:

UInt(4).leadingZeroBitCount //61

UInt16(4).leadingZeroBitCount //13

快速版本

4.1

用法

let strFive = String.binaryRepresentation(of: UInt8(5))
print(strFive) // Prints: 00000101 

了解一下

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

答案 12 :(得分:0)

这里的大多数答案都忘记占0,并且输出的表示太长了。

基于我提出的@karwag的答案:

from geopy import distance

listing = []
try:
    for coordinates in g.objects(None, predicate=URIRef('http://www.w3.org/ns/prov#generatedAtCoordinates')):
        final_coordinates = coordinates
        data = final_coordinates.split(",")
        latitude = float(data[0])
        longitude = float(data[1])
        calc_distance = (latitude, longitude)

        # each value from list of coordinates will be appended to 'listing' if it
        # is inside the 'for' loop.
        listing.append(calc_distance)

except ValueError:
    final_coordinates = 0

# create new list with all values from 'listing'
# except first coordinate pair.
sliced_listing = listing[1:]

# first coordinate pair in 'listing' will be compared to 
# each value in sliced list.
for coord_pair in sliced_listing:
    print(distance.distance(listing[0], coord_pair).km)