1、基础位运算
“<<” :左移
inta=5;// 二进制 0000 0101intb=a<<1;// 0000 1010,即 10intc=a<<2;// 0001 0100,即 20“>>” :右移
inta=8;intb=a>>1;// 4intc=a>>2;// 2“~” :按位取反
unsignedinta=0x0F;// 0000 1111unsignedintb=~a;// 1111 0000,即 0xFFFFFFF0“&” :有0就是0,
“|” :有1就是1
“^” :相同为0相异为1 / 无进位相加
2、运算符优先级
能加()就加,不要死记
3、给一个数n,确定它的二进制表示的第x位数是0还是1
n =(n>>x)& 1
让n右移x位,去判断第x位,按位与&:
有0则0,1的二进制前面全是0,可以把n变成要不是0要不是1
4、给一个数n,吧它的二进制表示的第x位数改成1
n=n |(1<<x)按位或|:
有1则1,1左移到x位是1,其他位全是0,保证只有x位能被改
5、给一个数n,吧它的二进制表示的第x位数改成0
n=n & [ ~ ( 1<<x ) ]
6、位图的思想
用一个int变量当哈希表,每一个比特位存储信息
7、提取一个数n二进制表示最右侧的1
n & -n
-n:先~再加1,使得最右侧1的左侧区域完全相反,按位与下将全变成0,即类似“0000000100”
8、删除一个数n二进制表示最右侧的1
n & (n-1)
n-1:因为要借位,相当于最右侧的1的右侧取反,而最右侧1被变成0
9、异或^的运算律
a ^ 0 = a
a ^ a = 0
a ^ b ^ c = a ^ ( b ^ c )