//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)
}
网友评论