位运算

在iOS开发中位运算多使用到枚举中,其他地方运用的相对较少。项目中合理的运用位运算能提高我们代码的执行效率。

一、位运算(包括与,或,取反,异或,左移,右移等)

1.左移<<
将一个数转成二进制往左边移动,右边补0
0011 => 0110
2.右移>>
将一个数转成二进制往右边移动,左边补0
0110 => 0011
3.与运算&
2个数进行与运算时,将2个数的二进制进行与操作, 只有当2个数对应的位都为1,该位运算结果为1,否则运算结果为0。

 1111
&1010
------
 1010

4.或运算|
2个数进行或运算时,将2个数的二进制进行或操作, 当2个数对应的位有一个为1,该位运算结果为1,否则运算结果为0。

 1111
|1010
------
 1111

5.异或运算^
2个数进行异或运算时,将2个数的二进制进行异或操作, 当2个数对应的位不同时,该位运算结果为1,否则运算结果为0。

 1111
^1010
------
 0101

6.取反操作~
将一个数的二进制位中位为1的变成0,位为0的变成1。
0011 => 1100

二、位运算运用

1.不用中间变量交换两个数

    int a=10; 
    int b=20; 
    a=a^b; 
    b=a^b; 
    a=a^b;

2.判断一个数的奇偶性

     if (x&1) {
         NSLog("奇数");
     } else   
        NSLog("偶数"); 
     }

3.两个整数之间的[汉明距离]指的是这两个数字对应二进制位不同的位置的数目。
给出两个整数 x 和 y,计算它们之间的汉明距离

当刚看到这个题目的时候,第一想法是x和y分别和2取余存进数组中,然后将两个数组按顺序比较不同的进行记录,后来发现位运算是正确的解题思路

    func hammingDistance(_ x: Int, _ y: Int) -> Int {
        var m = x^y
        var count = 0
        
        while m != 0 {
            if (m&1) == 1 {
                count+=1
            }
           m = m>>1
        }
        return count
    }

总结

这些只是位运算的一部分,在算法题目中会看到很多运用。

你可能感兴趣的:(位运算)