Ios 如何在swift中从用户处获取二进制字符串输入
我想从用户那里获取二进制输入,我想要的是: 10101 11110 然后我需要对这个执行按位OR。我知道如何获取输入以及如何执行按位或,我只想知道如何转换,因为我当前使用的并没有给出正确的结果。我的尝试如下: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 编辑:我不需要用基
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个字符,如:
1001101111101011011100101100100110111011111011000100111100111110111101011011011100111001100011111010
这超出了整数限制,在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”
所需的全部内容