一 & 与运算
当都为1时,才为1
1.保留指定位置
int a=0x0111;
int b=0x0010;
a=a&b; //a : 0x0010
2.判断奇数偶数
0为偶,1为计
int a=2;
int b=1;
a=a&1;// a: 0 偶数值为0
b=a&1;//b : 1 奇数值为1
二 | 或运算
当都为0时,才为0
1.设置指定位置为0的为1
int a=0x0001;
int b=0x0010;
int c=a|b; //c: 0x0011
三 ^ 异或运算
相异为1,相同为0。
同一个相异结果为0
1.交换数值
a=a^b;
b=b^a;
a=a^b;
2.当有一组数,只有一个数出现次数为奇数,其他数出现次数为偶数,那么这组数所有相异或的结果就是这个奇数。
四 ~ 取反
0变1,1变0
1.变换符号
取反后加1.
int a = 1;
a = ~a + 1;//a = -1;
五 <<左移
各二进位全部左移N位,高位丢弃,低位补0。相当于 原值*2的N次
六 >>右移
各二进位全部右移N位,低位丢弃,高位补0。相当于 原值/2的N次
如果是负数,高位补1而不是0.
位运算符运算级别较低,通常加上括号。
%取余运算符
有道题目是这样的: 求 100 % 8的 优化解法。我们知道:
8刚好是2的3次方
所以 100 % 8 == 100 - math.floor(100 / 8) * 8 == 100 - ((100 >> 3) << 3)