位操作有按位与(&)、或(|)、非(~)、异或(^)、左移n位(<< n)、右移n位(>> n)等操作。
java中的“>>>”运算符将用“0”填充高位,“>>”用符号位填充高位,没有“<<<”运算符。左移操作“<< ”,高位移出,空位补零。
java中对移位运算右侧的参数要做相应的取模处理,比如int类型的数1有32位,那么"1 << 35" == "1 << 3",效果相同,值为8;
在移位运算时,byte、short和char类型移位后的结果会变成int类型,
进行位操作时,不用再考虑原有类型的数值,只按位运算的规则来操作即可。
清0操作:和0”与“;
置1操作:和1“或”;
取出某位:和1”与“ 或者 和0“或”;
非操作“~”:将数的所有位按位取反,“0”变为“1”,“1”变为“0”;
XOR--异或运算:
相同为“0”,不同为“1”,也可用 [不进位加法] 来理解。
异或操作的一些特点:
x^0=x;
x^x=0;
x^(~0)=~x//~0 == 1s,表示所有位全为”1“;
x^(~x)=1s//1s表示所有位均为“1“;
异或操作满足乘法交换律和结合律:
那么,
a^a^b == a^b^a;
a^b=c可推出 a^c=b,b^c=a//swap
移位操作:
移位操作可看做乘以/除以2的幂。
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。
1.将 x 最右边的n位清零: x & (~0 << n);
2. 获取 x 的第n位的值: x & (1 << n);
3.将 x 第n位置为 1 : x | (1 << n);
4.将 x 第n位清 0 : x & ( ~(1<< n) );
5.将 x 的最高位至第 n 位 (含)清零:x& ( (1<
6.将 x 的第 n 位至第 0 位 (含)清零:x&( (~(1<<(n+1) - 1) );
8.将 x 第n位更新为写入值v(v取0或1): mask=v<