Ios 如何在swift中从用户处获取二进制字符串输入

Ios 如何在swift中从用户处获取二进制字符串输入,ios,swift,Ios,Swift,我想从用户那里获取二进制输入,我想要的是: 10101 11110 然后我需要对这个执行按位OR。我知道如何获取输入以及如何执行按位或,我只想知道如何转换,因为我当前使用的并没有给出正确的结果。我的尝试如下: let aBits: Int16 = Int16(a)! //a is String "10101" let bBits: Int16 = Int16(b)! //b is String "11110" let combinedbits = aBits | bBits 编辑:我不需要用基

我想从用户那里获取二进制输入,我想要的是: 10101 11110

然后我需要对这个执行按位OR。我知道如何获取输入以及如何执行按位或,我只想知道如何转换,因为我当前使用的并没有给出正确的结果。我的尝试如下:

let aBits: Int16 = Int16(a)! //a is String "10101"
let bBits: Int16 = Int16(b)! //b is String "11110"
let combinedbits = aBits | bBits
编辑:我不需要用基数进行十进制到二进制的转换,因为我的字符串已经只有0和1了 字符串最多可包含500个字符,如: 10011011111010110111001011001001101110111110110001001111001111101111010110110111‌​00111001100011111010 这超出了整数限制,在Swift中如何处理

Edit2:根据vacawama的回答,下面的代码非常有用:

let maxAB = max(a.count, b.count)
let paddedA = String(repeating: "0", count: maxAB - a.count) + a
let paddedB = String(repeating: "0", count: maxAB - b.count) + b

let Str = String(zip(paddedA, paddedB).map({ $0 == ("0", "0") ? "0" : "1" }))
我可以有多达500个字符串的数组,每个字符串最多可以有500个字符。然后,我必须得到所有可能的对,执行按位或运算,并计算最大数量的1。有什么办法使上述解决方案更有效?多谢各位

let number = Int(a, radix: 2)
基数有助于使用二进制而不是十进制值


基数有助于使用二进制而不是十进制值

您可以使用基数来转换字符串。转换后,可以执行按位或,然后检查非零位计数以计算1的数量

let a = Int("10101", radix: 2)!
let b = Int("11110", radix: 2)!

let bitwiseOR = a | b
let nonZero = bitwiseOR.nonzeroBitCount

可以使用基数转换字符串。转换后,可以执行按位或,然后检查非零位计数以计算1的数量

let a = Int("10101", radix: 2)!
let b = Int("11110", radix: 2)!

let bitwiseOR = a | b
let nonZero = bitwiseOR.nonzeroBitCount

正如我在上面已经评论过的,“10101”实际上是一个
字符串
而不是
二进制
,因此
“10101”|“11110”
不会计算您实际需要的内容

因此,您需要做的是将两个值都转换为
十进制
,然后使用
按位或
,并将结果转换回
二进制字符串
(数据的格式是“11111”而不是11111)

输出:31

现在将其转换回
二进制字符串

let binaryString = String(result, radix: 2)
print(binaryString)
输出:11111

-->编辑:-

我将回答一个关于如何计算
按位或
的基本示例,因为问题是不使用内置函数,因为字符串非常大,可以转换为
Int

算法:1 | 0=1,1 | 1=1,0 | 0=0,0 | 1=1

因此,我们要做的是从
字符串
中逐个提取所有字符,然后执行
操作并将其附加到另一个
字符串

var str1 = "100101" // 37
var str2 = "10111" // 23
/// Result should be "110111" -> "55"

// #1. Make both string equal
let length1 = str1.characters.count
let length2 = str2.characters.count
if length1 != length2 {
    let maxLength = max(length1, length2)
    for index in 0..<maxLength {
        if str1.characters.count < maxLength {
            str1 = "0" + str1
        }
        if str2.characters.count < maxLength {
            str2 = "0" + str2
        }
    }
}

// #2. Get the index and compare one by one in bitwise OR
// a) 1 - 0 = 1,
// b) 0 - 1 = 1,
// c) 1 - 1 = 1,
// d) 0 - 0 = 0
let length = max(str1.characters.count, str2.characters.count)
var newStr = ""
for index in 0..<length {
    let charOf1 = Int(String(str1[str1.index(str1.startIndex, offsetBy: index)]))!
    let charOf2 = Int(String(str2[str2.index(str2.startIndex, offsetBy: index)]))!
    let orResult = charOf1 | charOf2
    newStr.append("\(orResult)")
}

print(newStr)
func binaryOR(_ a: String, _ b: String) -> String {
    let maxAB = max(a.count, b.count)
    let paddedA = String(repeating: "0", count: maxAB - a.count) + a
    let paddedB = String(repeating: "0", count: maxAB - b.count) + b

    return String(zip(paddedA, paddedB).map({ $0 == ("0", "0") ? "0" : "1" }))
}

print(binaryOR("11", "1100"))    // "1111"
print(binaryOR("1000", "0001"))  // "1001"
var str1=“100101”//37
var str2=“10111”//23
///结果应该是“110111”->“55”
// #1. 使两个字符串相等
让length1=str1.characters.count
让length2=str2.characters.count
如果长度为1!=长度2{
设maxLength=max(长度1,长度2)

对于0中的索引,..正如我在上面所评论的那样,“10101”实际上是一个
字符串
而不是
二进制
,因此
“10101”|“11110”
将不会计算您实际需要的内容

因此,您需要做的是将两个值都转换为
十进制
,然后使用
按位或
,并将结果转换回
二进制字符串
(数据的格式是“11111”而不是11111)

输出:31

现在将其转换回
二进制字符串

let binaryString = String(result, radix: 2)
print(binaryString)
输出:11111

-->编辑:-

我将回答一个关于如何计算
按位或
的基本示例,因为问题是不使用内置函数,因为字符串非常大,可以转换为
Int

算法:1 | 0=1,1 | 1=1,0 | 0=0,0 | 1=1

因此,我们要做的是从
字符串
中逐个提取所有字符,然后执行
操作并将其附加到另一个
字符串

var str1 = "100101" // 37
var str2 = "10111" // 23
/// Result should be "110111" -> "55"

// #1. Make both string equal
let length1 = str1.characters.count
let length2 = str2.characters.count
if length1 != length2 {
    let maxLength = max(length1, length2)
    for index in 0..<maxLength {
        if str1.characters.count < maxLength {
            str1 = "0" + str1
        }
        if str2.characters.count < maxLength {
            str2 = "0" + str2
        }
    }
}

// #2. Get the index and compare one by one in bitwise OR
// a) 1 - 0 = 1,
// b) 0 - 1 = 1,
// c) 1 - 1 = 1,
// d) 0 - 0 = 0
let length = max(str1.characters.count, str2.characters.count)
var newStr = ""
for index in 0..<length {
    let charOf1 = Int(String(str1[str1.index(str1.startIndex, offsetBy: index)]))!
    let charOf2 = Int(String(str2[str2.index(str2.startIndex, offsetBy: index)]))!
    let orResult = charOf1 | charOf2
    newStr.append("\(orResult)")
}

print(newStr)
func binaryOR(_ a: String, _ b: String) -> String {
    let maxAB = max(a.count, b.count)
    let paddedA = String(repeating: "0", count: maxAB - a.count) + a
    let paddedB = String(repeating: "0", count: maxAB - b.count) + b

    return String(zip(paddedA, paddedB).map({ $0 == ("0", "0") ? "0" : "1" }))
}

print(binaryOR("11", "1100"))    // "1111"
print(binaryOR("1000", "0001"))  // "1001"
var str1=“100101”//37
var str2=“10111”//23
///结果应该是“110111”->“55”
//#1.使两个字符串相等
让length1=str1.characters.count
让length2=str2.characters.count
如果长度1!=长度2{
设maxLength=max(长度1,长度2)

对于0..中的索引,由于您需要任意长的二进制数,请使用字符串执行所有操作

此函数首先将两个输入填充到相同的长度,然后使用
zip
对数字进行配对,并使用
map
计算每对字符的
。生成的字符数组将转换回
字符串
字符串()


我可以有多达500个字符串的数组,每个字符串最多可以有500个 然后我必须得到所有可能的成对字符并按位执行 或者,数一数1的最大数目。有没有想到要做上述解决方案 更有效率

您必须进行
500*499/2
(即
124750
比较)。避免不必要和/或重复的工作非常重要

我建议:

  • 做一个初始过程,循环遍历字符串,找出最大字符串的长度。然后将所有字符串填充到此长度。我会在一个小窗口中跟踪每个字符串的原始长度:

    struct BinaryNumber {
        var string: String  // padded string
        var length: Int     // original length before padding
    }
    
  • 修改
    binaryOR
    函数以获取
    BinaryNumbers
    并返回
    Int
    ,或中“1”的计数

    func binaryORcountOnes(_ a: BinaryNumber, _ b: BinaryNumber) -> Int { 
        let maxAB = max(a.length, b.length)           
        return zip(a.string.suffix(maxAB), b.string.suffix(maxAB)).reduce(0) { total, pair in return total + (pair == ("0", "0") ? 0 : 1) }
    }
    
    注意:使用
    后缀
    有助于提高效率,只需检查重要的数字。如果原始字符串的长度为
    2
    3
    ,则即使将最后的
    3
    数字填充到长度
    500
    ,也只会对其进行填充

  • 循环并比较所有的
    BinaryNumber
    s对,以找到最大的一对:

    var numbers: [BinaryNumber]  // This array was created in step 1
    
    maxOnes = 0
    for i in 0 ..< (numbers.count - 1) {
        for j in (i + 1) ..< numbers.count {
            let ones = binaryORcountOnes(numbers[i], numbers[j])
            if ones > maxOnes {
                maxOnes = ones
            }
        }
    }
    
    print("maxOnes = \(maxOnes)")
    
    顺便说一下,原始字符串的
    长度实际上应该是包含最高阶
    1
    的最小长度。因此,如果原始字符串是
    “00101”
    ,那么
    长度应该是
    3
    ,因为这就是自您开始存储
    “101”
    所需的全部内容