美文网首页
位运算符应用举例(一)

位运算符应用举例(一)

作者: 一个栗 | 来源:发表于2021-06-09 09:32 被阅读0次

1.两个数字交换

  • 不借助临时变量,交换两个变量的值
var a = 10
var b = 8
a = a ^ b
b = a ^ b
a = a ^ b
print(a)
print(b)

打印结果如下:
8
10

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

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

  • 思路:看一个8位整数 10 100 001 ,先判断最后一位是否为1,而“与”操作可以达到目的。可以把这个八位的数字与 00000001 进行“与“操作,如果结果为1,则表示当前八位数的最后1位为1,否则为0。怎么判断第二位呢?向右移位,在延续前面的判断即可。
func countOfOnes(num:UInt) -> UInt {
    var count:UInt = 0
    var temp = num
    while temp != 0 {
        count += temp & 1
        temp = temp >> 1
    }
    print(count)
    return count
}
countOfOnes(num: 1)
countOfOnes(num: 3)
countOfOnes(num: 8)

打印结果如下:
1
2
1

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

  • 思路:为了简化这个问题,我们考虑只有高位有1的情况,如:11 000 000,如何跳过前面低位的6个0,而直接判断第七位的1?我们可以设计11 000 000 和10 111 111(也就是11 000 000 - 1)做“与”操作,消去最低位的1。如果得到的结果为0,说明我们已经找到或者消去里面最后一个1.如果不为0,那么说明我们消去了最低位的1,但是二进制中还有其他的1,我们的计数器要加1,然后继续上面的操作。
    计数器 count = 0
    步骤一:整数不为0,说明二进制里肯定有1,count = 1
    11 000 000 & 10 111 111 = 10 000 000 ()消去第七位的1
    步骤二:结果不为0,说明二进制中还有1,count = 2
    10 000 000 & 01 111 111 = 0 (消去第八位的1)
    步骤三:结果为0,终止,返回count = 2
func countOfOnes(num:UInt) -> UInt {
    var count:UInt = 0
    var temp = num
    while temp != 0 {
        count += 1
        temp = temp & (temp - 1)
    }
    print(count)
    return count
}
countOfOnes(num: 1)
countOfOnes(num: 3)
countOfOnes(num: 8)

打印结果如下:
1
2
1

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

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

  • 思路:一个整数如果是2的整数次方,那么它的二进制表示中有且只有一位是1,而其他所有位都是0。
func isPowerOfTwo(num:UInt) -> Bool {
    return (num & (num - 1)) == 0
}
isPowerOfTwo(num: 1)
isPowerOfTwo(num: 3)
isPowerOfTwo(num: 8)

结果如下:
true
false
true

相关文章

  • 位运算符应用举例(一)

    1.两个数字交换 不借助临时变量,交换两个变量的值 2.求无符号整数二进制中1的个数 2.1 给定一个无符号整数变...

  • 位运算符应用举例

    位运算在 LeetCode 上有一些练习题,没想到 张杰 老师在讲 Swift 的同时,还会举几个例子。这几个例子...

  • 位运算符

    常用位运算符: 左移与右移运算符应用举例: 注意:&和|既是逻辑运算符,也是位运算符。如果两侧操作数是boolea...

  • 位运算符应用举例(二)

    1.缺失的数字 1.1 很多成对出现的正整数保存在磁盘文件中,注意成对的数字不一定是相邻的。如2、3、4、3、4、...

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

  • C语言的位操作(Two)

    一、位运算赋值运算符 闲话就不多说,直接上图咯。 位运算赋值运算符 二、位运算应用 **eg:取一个整数a从右端开...

  • js 中位运算的应用

    按位运算符有6个: 按位与 & 按位或 | 按位异或 ^ 取反 ~ 右移 >> 左移 << 应用...

  • 强大的位运算符

    位取反运算符 位取反运算符(~)是对所有位的数字进行取反操作位取反运算符.png 位与运算符 位与运算符(&)可以...

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

  • 算法笔记4

    Java位运算 Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型...

网友评论

      本文标题:位运算符应用举例(一)

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