Swift编程

位运算符应用举例

2020-01-07  本文已影响0人  码农UP2U

位运算在 LeetCode 上有一些练习题,没想到 张杰 老师在讲 Swift 的同时,还会举几个例子。这几个例子虽然我都能做出来,但是却没有张杰老师的思路那么好,就是说代码的运行效率比老师介绍的要差许多。我觉得学这么久 Swift,都没有这几道练习题这么有价值。

两个数字交换

不借助临时变量,交换两个变量的值

// 两个数字的交换
var a = 10
var b = 8
a = a ^ b
b = a ^ b
a = a ^ b
print("a is \(a)")
print("b is \(b)")

求无符号整数二进制中 1 的个数

func countOfOnes(num: UInt) -> UInt {
    var count: UInt = 0
    var temp = num

    while temp != 0 {
        count += (temp & 1)
        temp = temp >> 1
    }
    
    return count
}
// 输出 5
print(countOfOnes(num: 0x1110110))
  1. 计数器 count = 0
  2. 步骤一:整数不为 0,说明二进制里肯定有 1,count = 1
    11 000 000 & 10 111 111 = 10 000 000 消去第 7 位的 1
  3. 步骤二:结果不为 0,说明二进制里还有 1,count = 2
    10 000 000 & 01 111 111 = 0 消去第 8 位的 1
  4. 步骤三:结果为 0,终止,返回 count 为 2
func countOfOnes2(num: UInt) -> UInt {
    var count: UInt = 0
    var temp = num

    while temp != 0 {
        count += 1
        temp = temp & (temp - 1)
    }

    return count
}
// 输出 5
print(countOfOnes2(num: 0x1110110))

引申:如何判断一个整数为 2 的整数次幂

func isPowerOfTwo(num: UInt) -> Bool {
    return (num & (num - 1)) == 0
}
// 输出 true
print(isPowerOfTwo(num: 4))
// 输出 false
print(isPowerOfTwo(num: 6))
// 输出 false
print(isPowerOfTwo(num: 9))


我的微信公众号:“码农UP2U”
上一篇 下一篇

猜你喜欢

热点阅读