社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
位运算符 |
||
运算符 |
运算 |
范例 |
<< |
左移 |
3 << 2 = 12 --> 3*2*2=12 |
>> |
右移 |
3 >> 1 = 1 --> 3/2=1 |
>>> |
无符号右移 |
3 >>> 1 = 1 --> 3/2=1 |
& |
(按位)与运算 |
6 & 3 = 2 |
| |
(按位)或运算 |
6 | 3 = 7 |
^ |
(按位)异或运算 |
6 ^ 3 = 5 |
~ |
(按位)反码 |
~6 = -7 |
同为1时,结果才是1;
同为0时,结果才是0;
不同为1,相同为0;
特点:
a ^ b = b ^ a;
a ^ 0 = a;
a ^ a = 0;
~1为0, ~0为1
注意事项:
位运算符只能连接整数和字符型。(我们可以把字符类型看成无符号的整型)
低位补0,被移除的高位丢弃
被移位的二进制最高位是0,右移后,空缺位补0;
最高位是1,最高位补1。
被移位二进制最高位无论是0或者是1,空缺位都用0补。
结论:
左移n各单位,相当于乘以2^n;
右移n各单位,相当于除以2^n;
如果移除的单位m, 超过了整数的字长a, 那么实际移位是 m 对 a 取余个单位。
class OperatorDemo7 {
public static void main(String[] args) {
/*int a = 64;
System.out.println(a << 2); // 256
System.out.println(a >> 2); //16
System.out.println(-a >> 2); // -16
System.out.println(a >>> 2); // 16
System.out.println(-a >>> 2); // */
System.out.println("---------------------------");
int m = 0xcafebabe;
System.out.println(m >>> 31); // 1
System.out.println(m >>> 32); // 0
System.out.println(m);
System.out.println(64 >>> -31); // 32 -31 mod 32 = 1 (数学中的取余运算)
}
}
flag &= MASK;
想要flag中哪些位“掩蔽”,就把MASK对应位置0;想要flag中哪些位“显出”,就把MASK对应位置1
flag |= MASK;
flag &= ~MASk;
flag ^= MASK;
if((flag & MASK) == MASK)
位运算是直接对二进制进行操作的,所以效率很高。
奇数的特点:
最后一个是1;
a & 1 == 1
class OperatorDemo2 {
public static void main(String[] args) {
int a = 2019;
// System.out.println(a % 2 == 1);
// System.out.println(a % 2 != 0);
System.out.println((a & 1) == 1);
}
}
a % 64
a & (64 - 1);
0100 1100 0101 1010 0100 1111 1011 0001
% 0000 0000 0000 0000 0000 0000 0100 0000
0000 0000 0000 0000 0000 0000 0011 0001
0100 1100 0101 1010 0100 1111 1011 0001
& 0000 0000 0000 0000 0000 0000 0011 1111
0000 0000 0000 0000 0000 0000 0011 0001
class OperatorDemo3 {
public static void main(String[] args) {
int a = 2019;
System.out.println(a % 64);
System.out.println(a & (64 - 1));
}
}
a & (a - 1) == 0;
特点:只有1位是1;
0001 0000
& 0000 1111
0000 0000
0011 0000
& 0010 1111
0010 0000
class OperatorDemo4 {
public static void main(String[] args) {
int a = 2019;
System.out.println((a & (a - 1)) == 0);
}
}
class OperatorDemo5 {
public static void main(String[] args) {
int a = 3;
int b = 4;
//方式一
/*int temp;
temp = a;
a = b;
b = temp;
System.out.println("a=" + a);
System.out.println("b=" + b);*/
// 方式二
// +和-互为逆运算;
/*a = a + b; // a = 3 + 4; b = 4;
b = a - b; // b = 3 + 4 - 4 = 3; a = 3 + 4
a = a - b; // a = a - b = 3 + 4 - 3 = 4; b = 3;
System.out.println("a=" + a);
System.out.println("b=" + b);*/
// 方式三
/*a = a ^ b; // a = 3 ^ 4; b = 4;
b = b ^ a; // b = 3 ^ 4 ^ 4 = 3 ^ 0 = 3, a = 3 ^ 4;
a = a ^ b; // a = 3 ^ 4 ^ 3 = 4 ^ 0 = 4, b = 3;
System.out.println("a=" + a);
System.out.println("b=" + b);*/
// 用一句话搞定;
/*a ^= b ^= a ^= b;
System.out.println("a=" + a); // a = 0
System.out.println("b=" + b); // b = 3*/
// 不要在代码中这样写!!!
// 代码最好简单易懂!,不要难为别人。
// a = (a + b) - (b = a);
a = (a ^ b) ^ (b = a);
System.out.println("a=" + a);
System.out.println("b=" + b);
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!