位运算符: &(位与) |(位或) ~(位取反) ^(位异或)
当这4个的左右边是常数的时候,是位运算符
<< , >> , >>>
分析:因为是位运算,所以我们必须先把数据换算成二进制。
&(位与)运算 :有0则0。
|(位或)运算 :有1则1。
^位(异或)运算 :相同则0,不同则1。
^的特点 :一个数据对另一个数据位异或两次,该数本身不变。
[代码]xml代码:
?
1 2 3 4 | int a = 10;
int b = 20;
System.out.println(a ^ b ^ b); //10
System.out.println(a ^ b ^ a); //20
|
练习题:
请自己实现两个整数变量的交换
[代码]xml代码:
?
01 02 03 04 05 06 07 08 09 10 | int a = 10;
int b = 20; // 使a,b的值交换
// 第一种方法,使用第三方变量(开发中用的)
int c = a;
a = b;
b = c;
// 第二种方法,使用异或方法(面试用) 左边:a,b,a 右边:a ^ b
a = a^b;
b= a^b; // b=a^b^b = a
a=a^b; // a=a^b^a ( 此时b在上面已经变成了a) = a
|
[代码]xml代码:
?
1 2 3 4 | 第三种方法:用变量相加
a = a+b; // a = 30
b = a-b; // b = 30-20 = 10
a = a-b; // a = 30 - 10 = 20
|
[代码]xml代码:
?
1 2 | 第四种方法
b = (b+a) - (a=b); // b = (10 + 20) - 20 = 10 , 此时a = b = 20
|
~(按位取反)运算符 :0变1,1变0
<< : 左移 左边最高位丢弃,右边补齐0
>> : 右移 最高位是0,左边补齐0;最高为是1,左边补齐1
>>> : 无符号右移 无论最高位是0还是1,左边都补齐0
[代码]xml代码:
?
1 2 3 | << 把 << 左边的数据乘以2 的 移动次幂
System.out.println(3 << 2); // 3*2^2 = 3*4 = 12
>> 把 >> 左边的数据除以2 的 移动次幂
|
?
1 | System.out.println(24 >> 2); // 24 / 2^2 = 24 / 4 = 6
|
无论正负:
[代码]xml代码:
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | -24 >> 2 的移动:
计算出24的二进制:11000
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000
11111111 11111111 11111111 11101000
1111111111 11111111 11111111 111010(00) 补码
移动后的计算:
补码:1111111111 11111111 11111111 111010
反码:1111111111 11111111 11111111 111001
原码:1000000000 00000000 00000000 000110
结果:-6
|
面试题:
请用最有效率的方式写出计算2乘以8的结果
[代码]xml代码:
?
1 | System.out.println(2 << 3); // 2 * 2^3 = 2 * 8
|
原文链接:http://www.apkbus.com/blog-833059-61614.html