开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情
运算类的题目也经常会遇到,这类题目不好总结规律,一般都是考察对计算机的基础运算的理解。下面举例一下位运算的基本操作:
位运算
位运算的基本操作:
按位与(&):
两位同时为“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
位运算题举例
题解:就是让你返回 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. 只出现一次的数字 II、190. 颠倒二进制位、338. 比特位计数、342. 4的幂、371. 两整数之和、461. 汉明距离、477. 汉明距离总和、526. 优美的排列、1178. 猜字谜、1711. 大餐计数、剑指 Offer 15. 二进制中1的个数 其他数学运算的题还有:7. 整数反转、50. Pow(x,n)、440. 字典序的第K小数字