一.技巧
1.特殊数&或者!
2.本身异或为0,与0异或为本身,满足交换律
例:不借助第三数 交换两数
3.取反加1
求相反数
4.巧妙分组处理(16bit位的数)
分为8组(
分组需要与0xAAAA或者0x5555相与,
交换位置需要移动1位)
a&0xAAAA
10
10,
10
10,
10
10,
10
10
(a&0xAAAA)>>1
10
10,
10
10,
10
10,
10
10
a&0X5555 0101,0101,0101,0101
(a&0X5555)<<1 0101,0101,0101,0101
(a&0xAAAA)>>1
| (a&0X5555)<<1
分为4组(
分组需要与0xCCCC或者0x3333相与,
交换位置需要移动2位)
a&0xCCCC
1100,
1100,
1100,
1100.
(a&0xCCCC)>>2
1100,
1100,
1100,
1100
0x3333 00
11,00
11,0011,00
11
0011,0011,0011,0011
分为2组(
分组需要与0xF0F0或者0x0F0F相与,
交换位置需要移动4位)
0xF0F0
1111,0000,
1111,0000.
1111,0000,
1111,0000.
0000,
1111,0000,
1111
0000,
1111,0000,
1111
分为1组(
分组需要与0xFF00或者0x00FF相与,
交换位置需要移动8位)
0XFF00
1111,1111,0000,0000.
0000,0000,
1111,1111
5.异或模拟加法
0&0=0;0&1=0; 1&0=0; 1& 1 = 1
0|0=0; 0|1=1; 1|0=1; 1|1=1;
0^0=0; 0^1=1; 1^0=1; 1^1=0;
异或运算是不是和二进制加法很像,缺少进位而已?后面用逻辑运算实现加法讲解
6.常用等式
(1)-n=~(n-1)=~n+1 //求绝对值使用