美文网首页
位运算算法

位运算算法

作者: 点滴86 | 来源:发表于2022-08-10 15:52 被阅读0次

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

    var a = 10
    var b = 6
    
    a = a ^ b
    b = a ^ b
    a = a ^ b
    print(a)
    print(b)

2、给定一个无符号整型(UInt)变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能的高
思路:看一个八位整数10010001,先判断最后一位是否为1,而“与”操作可以达到目的。可以把这个八位的数字与00000001进行"与"操作。如果结果为1,则表示当前八位数的最后一位为1,否则为0。怎么判断第二位呢?向右移位,再延续前面的判断即可。

func getCountOfOne(num: UInt) -> UInt {
    var tmp = num
    var count: UInt = 0
    var loopCount = 0
    while tmp != 0 {
        count += tmp & 1
        tmp = tmp >> 1
        loopCount += 1
    }
    print("getCountOfOne循环次数\(loopCount)")
    
    return count
 }

3、如果整数的二进制中有较多的0,那么我们每一次右移一位做判断会很浪费,怎么改进前面的算法呢?有没有办法让算法的复杂度只与“1”的个数有关?
思路:为了简化这个问题,我们考虑只有高位有1的情况。例如:11000000,如何跳过前面低位的6个0,而直接判断低七位的1?我们可以设计11000000和10111111(也就是11000000 - 1)做“与”操作,消去最低位的1。如果得到的结果为0,说明我们已经找到或者消去里面最后一个1。如果不为0,那么说明我们消去了最低位的1,但是二进制中还有其他的1,我们的计数器需要加1,然后继续上面的操作。

 func getCountOfOne2(num: UInt) -> UInt {
    var tmp = num
    var count: UInt = 0
    var loopCount = 0
    while tmp != 0 {
        count += 1
        tmp = tmp & (tmp - 1)
        loopCount += 1
    }
    print("getCountOfOne2循环次数\(loopCount)")
    
    return count
 }

4、给定一个无符号整型(UInt)变量,判断是否为2的整数次幂。
思路:一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其它所有位都是0。根据前面的分析,把这个整数减去1后再和它自己做与运算,这个整数中唯一的1就变成0了,也就是得到的结果为0。

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

相关文章

  • 递归、回溯、分治

    递归 (1)子集 方式一:递归算法 方式二:位运算算法 (2)子集II 方法一:递归算法 方法二:位运算 (3)组...

  • 位运算 算法

    位运算 算法 -1.与: &或: |非: !异或 : ^ 相同为 0, 不同为 1int 32 位 -> int ...

  • 算法

    算法实战 | 图像处理, 宽度优先搜索, 位运算

  • 算法位运算总结

    在位运算之前,对二进制需要掌握的基础知识 正数的二进制,例如 5原码是 0000 0000 0000 0000 0...

  • 位运算小算法

    判断一个数是不是2的N次幂(能被2整除)swift篇 按照二进制中只有一个1的时候才是2的N次幂,例如000000...

  • 算法很美--位运算

    2019/3/22更新 题目1 : Exam07_TwoSingleNumbers时间限制:2000ms单点时限:...

  • 算法总结-位运算

    位运算符用于二进制运算 与运算 & 二进制数 n & 1 的结果为n的末位 异或运算 ^ 长度为 L 的二进制数 ...

  • 算法技巧-位运算

    将只有两种状态的一组对象用二进制进行表示是一种常用建模方法,因此位运算技巧是比较重要的。 位操作经典题目:37. ...

  • 位运算算法

    1、不借助临时变量,交换两个变量的值 2、给定一个无符号整型(UInt)变量,求其二进制表示中"1"的个数,要求算...

  • 位运算之——按位与(&)操作——(快速取模算法)

    位运算之——按位与(&)操作——(快速取模算法) (2012-08-02 10:23:12) 分类:算法学习 由于...

网友评论

      本文标题:位运算算法

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