《算法很美》笔记整理—Chpter 1
本章内容主要围绕着位运算展开
-
位运算:
使用符号 “>>>” 进行右移操作的时候是用0来填充高位;
(用于unsigned, 不存在符号 “<<<” )
使用符号 “>>” 进行右移操作的时候是用符号位填充高位;
对于int数据类型: 1 << 35 与 1 << 3 相同, 超过32则%32;
(计算机通过模运算实现加减法的统一)
对于long数据类型: 类似, 但是超过64则%64;
-
“奇巧淫技”:
① 判断奇偶: X & 1 = 1 => X是奇数; X & 1 = 0 => X是偶数;
(根据最后一位数 0/1 就可以判断奇偶性,其他部分可以不考虑)
② 获取二进制第k位上为1 or 0: 先将 1 左移 n 位 到 k;
X & (1 << n) = 1 => 第k位上为1; X & (1 << n) = 0 => 第k位上为0;
(n是移动位数, 1 << n 除了该位为 1, 其余部分为 0,起到了屏蔽作用)
③ 交换两个整数: a = a^b; b = b^a; a = a^b;
(注意要处理 a == b 的情况, 否则都会变成 0)
(注意只能是整数,不需要中间变量temp,且运算速度和运算范围要好于以下方法)
a = a+b; b = a-b; a = a-b;
④求绝对值: int i = a >> 31; return ( ( a^i ) - i );
(a >> 31 得到的就是 a 的符号位, 如果 a < 0, 那么 i = 0xFFFFFFFF = -1;
如果 a >= 0, 那么 i = 0x00000000 = 0; )
Summary: 异或, 可以理解为是不进位加法。 1^1 = 0, 0^0 = 0, 1^0 = 1。性质: 1) 交换律: a^b = b^a
2) 结合律: abc = a(bc)
3) x^x = 0 x^0 = x(0是不影响异或的结果的)
4) ABB = A^0 = A (与连续同因子做异或运算)