iOS算法刷题之数学运算

101 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

数学运算.png

运算类的题目也经常会遇到,这类题目不好总结规律,一般都是考察对计算机的基础运算的理解。下面举例一下位运算的基本操作:

位运算

位运算的基本操作:

按位与(&):

两位同时为“1”时,结果才为“1”,否则为“0”

即:0&0 = 0; 0&1 = 0; 1&0 = 0; 1&1 = 1;

按位或(|):

两位中只要有一位为“1”,结果就为“1”

即:0|0 = 0; 0|1 = 1; 1|0 = 1; 1|1 = 1

异或(^):

两位的值不同,则结果为“1”,否则结果为“0”

即:0^0 = 0; 0^1 = 1; 1^0 = 1; 1^1 = 0

取反(~):

对一位进行取反,“0”变“1”,“1”变“0”

即:~1 = 0; ~0 = 1;

左移(<<):

将一个二进制位全部左移若干位(左边的二进制位丢弃,右边补0)

即 a << 1 将a的二进制位左移1位,右补0,如果左移没有舍弃高位不包含1,则每左移1位,相当于该数*2

右移(>>):

将一个二进制位全部右移若干位(正数左补0,负数左补1,右边丢弃)

即:a>>1 将a的二进制位右移1位,左补“0”或补“1”需要看a本身是正还是负。操作数每右移一位,相当于该数/2

n & (n-1)

消除数字n的二进制表示中的最后一个1,消除最后一个1同时把其后的0都变成1

a ^ a = 0

一个数和它本身做异或运算结果为0,即 a ^ a = 0;一个数和0做异或运算的结果为它本身,即a ^ 0 = a

位运算题举例

191. 位1的个数

题解:就是让你返回 n 的二进制表示中有几个1,因为 n & (n-1) 可以消除最后一个1,所以可以用一个循环不停地消除1,同时计数,直到n变成0为止。

class Solution {
func hammingWeight(_ n: Int) -> Int {
    var res = 0
    var n = n
    while n != 0 {
        n = n & (n-1)
        res += 1
    }
    return res
}
}

位运算的经典题还有:231. 2的幂136. 只出现一次的数字268. 丢失的数字137. 只出现一次的数字 II190. 颠倒二进制位338. 比特位计数342. 4的幂371. 两整数之和461. 汉明距离477. 汉明距离总和526. 优美的排列1178. 猜字谜1711. 大餐计数剑指 Offer 15. 二进制中1的个数 其他数学运算的题还有:7. 整数反转50. Pow(x,n)440. 字典序的第K小数字