运算符¶
逻辑运算符¶
运算符 | 说明 |
---|---|
a && b | 逻辑与 |
a || b | 逻辑或 |
! a | 逻辑非 |
位运算符¶
按位非( ~ )¶
对所有位的数字进行取反操作。
输入:0 0 0 0 1 1 1 1
输出:1 1 1 1 0 0 0 0
按位与( & )¶
对两个数的比特位进行合并。它会返回一个新的数,只有当这两个数都是 1 的时候才能返回 1。
Input1:1 1 1 1 1 1 0 0
Input2:0 0 1 1 1 1 1 1
result: 0 0 1 1 1 1 0 0
按位或( | )¶
对两个比特位进行比较,然后返回一个新的数,只要两个操作位任意一个为 1 时,那么对应的位数就为 1。
Input1:1 0 1 1 0 0 1 0
Input2:0 1 0 1 1 1 1 0
result: 1 1 1 1 1 1 1 0
按位异或( ^ )¶
或者说“互斥或”可以对两个数的比特位进行比较,它返回一个新的数。
当两个操作数的对应位不相同时,该数的对应位就为 1 。
Input1:0 0 0 1 0 1 0 0
Input2:0 0 0 0 0 1 0 1
result: 0 0 0 1 0 0 0 1
位左移和右移运算符¶
位左移运算符( << )和位右移运算符( >> )可以把所有位数的数字向左或向右移动一个确定的位数。
位左移和右移具有给整数乘以或除以二的效果。将一个数左移一位相当于把这个数翻倍,将一个数右移一位相当于把这个数减半。
原数:100 = 4
右移:10 = 2
左移:1000 = 8
//利用位移,8字节对齐。
int func0(int x)
{
// return (x + 7) / 8 * 8;//等于下面这行
return (x + 7) >> 3 << 3;//先往右 再往左
}
int a = func0(50);
NSLog(@"a:%d",a);//输出56
位运算符经典算法¶
不借助临时变量,交换两个变量的值¶
var a = 10
var b = 8
a = a ^ b//a是a b不同位的记录
b = a ^ b
a = a ^ b
print(a,b)
成对数字中缺失的数字¶
思路:考虑“异或”操作的定义,当两个操作数的对应位不相同时,该数的对应位就为1 。
也就是说如果是相等的两个数“异或”,得到的结果为 0 ,而 0 与任何数字“异或”,得到的是那个数字本身。所以我们考虑将所有的数字做“异或”操作,因为只有一个数字消失,那么其他两两出现的数字“异或”后为 0 ,0 与仅有的一个的数字做“异或”,就得到了消失的数字是哪个。
func findLostNum(nums: [UInt]) -> UInt {
var lostNum: UInt = 0
for num in nums {
lostNum = lostNum ^ num
print(lostNum)
}
return lostNum
}
print(findLostNum(nums: [1, 1, 2, 3, 4, 3, 2, 4, 5]))
如果有两个数字意外丢失了(丢失的不是相等的数字),该如何找到丢失的两个数字?¶
思路:
设题目中这两个只出现 1 次的数字分别为 A 和 B,如果能将 A,B 分开到二个数组中,那显然符合“异或”解法的关键点了。因此这个题目的关键点就是将 A,B 分开到二个数组中。
由于 A,B 肯定是不相等的,因此在二进制上必定有一位是不同的。根据这一位是 0 还是 1 可以将 A 和 B 分开到 A组 和 B组。而其它成对的数字要么两个都属于 A 组,要么两个都属于 B 组。再对 A组 和 B组 分别执行“异或”解法就可以得到 A,B 了。而要判断 A,B 在哪一位上不相同,只要根据 “A 异或 B” 的结果就可以知道了,这个结果在二进制上为 1 的位都说明 A,B 在这一位上是不相同的。
func findTwoLostNum(nums: [UInt]) -> (UInt, UInt) {
var lostNum1: UInt = 0
var lostNum2: UInt = 0
//1. 找到缺失的两个数 异或 的结果
var temp: UInt = 0
for num in nums {
temp = temp ^ num
}
//2. 找到第一个为1的位
var flag: UInt = 1
while ((flag & temp) == 0) {
flag = flag << 1
}
//找两个丢失的数字
for num in nums {
if flag & num == 0 {//A组 结果为0的一组
lostNum1 = lostNum1 ^ num
} else { //B组 结果为1的一组
lostNum2 = lostNum2 ^ num
}
}
return (lostNum1, lostNum2)
}
print(findTwoLostNum(nums: [1, 1, 2, 3, 3, 2, 4, 6]))