【问题标题】:How to convert a binary to decimal in Swift?如何在 Swift 中将二进制转换为十进制?
【发布时间】:2015-01-03 14:52:54
【问题描述】:

我正在寻找一种在 Swift 中将二进制数转换为十进制的简单方法。比如二进制的“10”变成十进制的“2”。

谢谢,

【问题讨论】:

标签: swift swift2


【解决方案1】:

更新 Swift 2:所有整数类型都有一个

public init?(_ text: String, radix: Int = default)

方法现在,它根据以下将字符串转换为整数 给定的基础:

let binary = "11001"
if let number = Int(binary, radix: 2) { 
    print(number) // Output: 25
}

(上一个答案:) 您可以简单地使用 BSD 库函数 strtoul(),它将字符串转换为 根据给定基数的数字:

let binary = "11001"
let number = strtoul(binary, nil, 2)
println(number) // Output: 25

【讨论】:

  • 与其他解决方案一样有趣,使用库是正确的答案。
  • 你能告诉我如何处理非常大的二进制字符串。例如这样的二进制字符串:“1001101111101011011100101100100110111011111011000100111100111110111101011011011100111001100011111010”。当前的解决方案无法转换这个很长的数字。
  • @SalehMasum:Swift 中最大的整数类型是 UInt64。没有可以容纳 100 位数字的整数类型。您可以将字符串拆分成更小的块,或者寻找“大整数”库。
  • @MartinR 感谢您的精彩解释。现在我明白为什么它不起作用了。我需要看看 BigInteger 之类的东西。
【解决方案2】:

更新:Xcode 7.2 • Swift 2.1.1

您可以使用名为 strtoul 的 C++ 函数来实现 Martin R 的答案,如下所示:

extension String {
    var hexaToInt      : Int    { return Int(strtoul(self, nil, 16))      }
    var hexaToDouble   : Double { return Double(strtoul(self, nil, 16))   }
    var hexaToBinary   : String { return String(hexaToInt, radix: 2)      }
    var decimalToHexa  : String { return String(Int(self) ?? 0, radix: 16)}
    var decimalToBinary: String { return String(Int(self) ?? 0, radix: 2) }
    var binaryToInt    : Int    { return Int(strtoul(self, nil, 2))       }
    var binaryToDouble : Double { return Double(strtoul(self, nil, 2))   }
    var binaryToHexa   : String { return String(binaryToInt, radix: 16)  }
}

extension Int {
    var binaryString: String { return String(self, radix: 2)  }
    var hexaString  : String { return String(self, radix: 16) }
    var doubleValue : Double { return Double(self) }
}

"ff".hexaToInt              // "255"
"ff".hexaToDouble           // "255.0"
"ff".hexaToBinary           // "11111111"
"255".decimalToHexa         // "ff"
"255".decimalToBinary       // "11111111"
"11111111".binaryToInt      // "255"
"11111111".binaryToDouble   // "255.0"
"11111111".binaryToHexa     // "ff"
255.binaryString            // "11111111"
255.hexaString              // "ff"
255.doubleValue             // 255.0

【讨论】:

    【解决方案3】:

    二进制是 swift 内置的,使用 0b 前缀

    println( 0b11001 ) // Output: 25
    

    【讨论】:

      【解决方案4】:

      可能有一个内置函数可以做到这一点,但自己编写代码并不难:

      func parseBinary(binary: String) -> Int? {
          var result: Int = 0
      
          for digit in binary {
              switch(digit) {
                  case "0": result = result * 2
                  case "1": result = result * 2 + 1
                  default: return nil
              }
          }
          return result
      }
      

      该函数返回一个(可选的)Int。如果您想获取字符串,可以执行以下操作:

      String(parseBinary("10101")!)
      -> "21"
      

      注意强制展开 (!) 如果您提供的字符串包含除 0 或 1 以外的任何内容,则该函数将返回 nil,并且此表达式将崩溃。

      或者,从 Leonardo 那里得到启发,您可以将其构建为字符串的扩展:

      extension String {
          func asBinary() -> Int? {
              var result: Int = 0
      
              for digit in self {
                  switch(digit) {
                      case "0": result = result * 2
                      case "1": result = result * 2 + 1
                      default: return nil
                  }
              }
              return result
          }
      }
      
      "101".asBinary()!
      -> 5
      

      【讨论】:

        猜你喜欢
        • 2014-11-28
        • 2023-04-05
        • 2011-02-17
        • 1970-01-01
        • 1970-01-01
        • 2018-01-21
        • 2012-06-26
        相关资源
        最近更新 更多