位运算的实际应用 【俩数字交换不借助遍历】【寻找1出现的次数】【如何判断一个整数为2的整数次幂】

两个数字交换位置,不借助临时变量

//: A UIKit based Playground for presenting user interface
  
import UIKit

var a = 10
var b = 8
a = a^b
b = a^b
a = a^b

效果

位运算的实际应用 【俩数字交换不借助遍历】【寻找1出现的次数】【如何判断一个整数为2的整数次幂】_第1张图片

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

给定一个无符号整数Uint变量 ,求其二进制表示中  1的个数,要求算法的执行效率尽可能的高

code

解题思路 与1与法

//: A UIKit based Playground for presenting user interface
  
import UIKit


func countOfOnes(num:UInt)->UInt{
    var count:UInt = 0
    var temp = num;
    while temp != 0 {
        count+=temp & 1
        temp = temp>>1
    }
    return count
}

countOfOnes(num: 1)

countOfOnes(num: 2)

countOfOnes(num: 3)

效果

位运算的实际应用 【俩数字交换不借助遍历】【寻找1出现的次数】【如何判断一个整数为2的整数次幂】_第2张图片

 如果整数的二进制中有较多的0,那么我们每次右移一次一位数去做判断会很浪费,怎么改进前面的算法呢?有没有让算法的复杂度只与1的个数有关?

 

下面解题思路 是削1法 

//: A UIKit based Playground for presenting user interface
  
import UIKit


func countOfOnes(num:UInt)->UInt{
    var count:UInt = 0
    var temp = num;
    while temp != 0 {
        count += 1
        temp = temp & (temp - 1)
    }
    return count
}

countOfOnes(num: 1)

countOfOnes(num: 2)

countOfOnes(num: 3)

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

给定一个无符号整形变量(UInt) ,判断是否位2的整数次幂

思路

一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0,根据前面的分析,把这个整数减去1后再和他自己做运算,这个整数中唯一的1就变成0了,也就是得到的结果为0

code

//: A UIKit based Playground for presenting user interface
  
import UIKit

func isPowerOfTwo(num:UInt) -> Bool{
    return (num & (num-1)) == 0
}


isPowerOfTwo(num: 1)

isPowerOfTwo(num: 2)

isPowerOfTwo(num: 3)

isPowerOfTwo(num: 4)

isPowerOfTwo(num: 5)

效果

位运算的实际应用 【俩数字交换不借助遍历】【寻找1出现的次数】【如何判断一个整数为2的整数次幂】_第3张图片

你可能感兴趣的:(#,swift)