美文网首页
swift5.0 记录(3)

swift5.0 记录(3)

作者: rhc2008 | 来源:发表于2021-06-13 23:44 被阅读0次
//let vc  = ViewController()
//let nav = UINavigationController(rootViewController: vc)
//PlaygroundPage.current.liveView = nav

//1 String
// string to use
let greeting = "Guten,Tag!"
greeting[greeting.startIndex]
greeting[greeting.index(before: greeting.endIndex)]
greeting[greeting.index(after: greeting.startIndex)]
var idx = greeting.index(greeting.startIndex,offsetBy: 7)
greeting[idx]

// insert
var welcome = "Hello"
welcome.insert("!", at: welcome.endIndex)
welcome.insert(contentsOf: " there", at: welcome.index(before: welcome.endIndex))

//remove
welcome.remove(at: welcome.index(before: welcome.endIndex))
//print(welcome)
let range = welcome.index(welcome.endIndex,offsetBy: -6)..<welcome.endIndex
welcome.removeSubrange(range)
//print(welcome)

//substring
idx = greeting.firstIndex(of:",") ?? greeting.endIndex
let beginning = greeting[..<idx]
let newString = String(beginning)

// equal
let s = "hello"
//print(welcome == s)
//print(welcome.hasPrefix("hello"))
//print(welcome.hasSuffix("world"))

let  rg = "a"..."z"
for c in welcome {
    if !rg.contains(String(c)) {
        print("\(c) 不是小写字母 ")
    }
}

//2 the value of overflow
// 让系统支持溢出运算
// + 溢出 (&+)
// - 溢出 (&-)
// * 溢出 (&*)

let num1:UInt8 = 250
let num2 = num1 &+ 10
let num3:UInt8 = 0
let num4 = num3 &- 1
//print(num2)
//print(num4)
//
let num5:Int8 = -128
let num6 = num5 &- 1
//print(num6)

//for i in (0...10).reversed() {print(i)}

/*
负数据存储方式:它存储的是2^n减去它的绝对值,这里的n为数值位的位数据
Sign bit     value bits
   1          1111111     = -4

              1111111     = 128
补码表示优点:
首先,如果想给-4加个-1 只需要将这两个数的全部八个比特位相加(包括符号位),并将计算结果中超出的部分丢弃. 使用补码可以使负数的位左移和右移操作得到跟正数同样的效果,即每向左移一位就将自身的数*2,每向右移一位就将自身的数值/2.
 
 规则:当对整数进行位右移操作时,遵循与无符号整数相同的规则,但是对于移位产生的空折位使用符号位进行填充,而不是 0
        1 1111100   =-4
 +1     1 1111111   =-1
 =1     1 1111011   =-5
*/
func countOfOnes(num:UInt) -> UInt {
    var count :UInt = 0
    var tmp = num
    while tmp != 0 {
        count += 1
        tmp = tmp & (tmp - 1)
    }
    return count
}

//如果是2的整数次方,化的二进制表示中有且只有一位是1,其他所有位都是0
func isPowerOfTwo(num:UInt) -> Bool {
    return (num & (num - 1)) == 0
}

//1> 找到文件中丢失的数字(找到只出现一次 出现的数字)

//很多成对出出外的正整数保存在磁盘文件中,注意对对的数字不一定是相邻的,如2,3,4,2,4,2..,由于意外有一个数字消失了,如何尽快找到是哪个数字消失了?
/*
 当两个操作数的对应位不相同时,该数的对应位就为1.
 也就是说如果是相等的两个数异或,得到的结果为0,而0与任何数字异或,得到的是那个数字本身。
 所以考虑将所有的数字做异或操作,因为只有一个数字消失,那么其他两两出现的数字异或后为0,0与仅有的一个数字做
 异或,就得到了消失的数字是哪个
 */
func findLostNum(nums: [UInt]) -> UInt {
    var lostNum:UInt = 0
    for num in nums {
        lostNum = lostNum ^ num
    }
    return lostNum
}

//2> 如果有两个数字意外丢失,该如何找到丢失的两个数字
func findLost2Num(nums: [UInt]) -> (UInt,UInt) {
    var lostNum1:UInt = 0
    var lostNum2:UInt = 0
    var tmp:UInt = 0
    //计算两个数的异或结果
    for num in nums {
        tmp = tmp ^ num
    }
    
    // 找到第一个为1的位
    var flag:UInt = 1
    while((flag & tmp ) == 0 ) {
        flag = flag << 1
    }
    
    // find 2 lost nums
    for num in nums {
        if (num & flag) == 0 {
            lostNum1 = lostNum1 ^ num
        }else {
            lostNum2 = lostNum2 ^ num
        }
    }
    
    return (lostNum1,lostNum2)
}

相关文章

网友评论

      本文标题:swift5.0 记录(3)

      本文链接:https://www.haomeiwen.com/subject/polneltx.html