/*
位运算 二进制 补码
基本的 &(与) |(或) ^(异或) ~(按位取反)
连接的是数值(除了布尔类型的)
一般我们做案例,用的数据都是采用整数 (int)
*/
class OperatorDemo{
public static void main(String[] args) {
int a = 3;
int b = 4;
//位与&
System.out.println(a&b);//0
//位或
System.out.println(a|b);//7
//位异或
System.out.println(a^b);//7
//按位取反
System.out.println(~3);
}
}
/*
模拟底层运算:
二进制 的补码
int a 4个字节 32 3
原码 00000000 00000000 00000000 00000011
int b 4个字节 32 4
原码 00000000 00000000 00000000 00000100
位与运算 :有0则0
00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100
------------------------------------------
00000000 00000000 00000000 00000000
结果 0
位或运算: 有1则1
00000000 00000000 00000000 00000011
| 00000000 00000000 00000000 00000100
------------------------------------------
00000000 00000000 00000000 00000111
结果是 7
位异或运算:相同为0 不同为1
00000000 00000000 00000000 00000011
^ 00000000 00000000 00000000 00000100
------------------------------------------
00000000 00000000 00000000 00000111
结果是7
按位取反 ~ 每一位 0变1 1变0
00000000 00000000 00000000 00000011
~
-----------------------------------------
11111111 11111111 11111111 11111100 补码
11111111 11111111 11111111 11111011 反码
10000000 00000000 00000000 00000100 原码
(-4)
*/
/*
位异或特点:
^
一个数 与另一个数 位异或两次 得到结果是其值本身
*/
class OperatorDemo2{
public static void main(String[] args) {
int a = 3;
int b = 4;
System.out.println(a^b^a);//4 难道得到的结果是b吗
System.out.println(a^b^b);//如果我得到的结果是3 说明一个结论:结果是a
}
}
/*
位运算 二进制 补码
A:案例演示
<<:左移 这个数的二进制 进行 左移 空位补0,被移除的高位丢弃。
>>:右移 被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,高位补1。
>>>:无符号右移 被移位二进制最高位无论是0或者是1,空缺位都用0补。
B:结论:
<< : 把<<左边的数据乘以2的移动次幂
>> : 把>>左边的数据除以2的移动次幂
面试题:
请用最有效率的方式计算出2*8的结果?
做位运算最快了
2*8 = 2*2^3
2<<3
64/8
=64/2^3 = 64>>3
*/
class OperatorDemo3{
public static void main(String[] args) {
//左边数据乘以2的移动次方
System.out.println(3<<2);//3*2^2 = 12
//System.out.println(3<<3);//3*2^3 = 24
//>> 右移
//左边数据除以2的移动次方
System.out.println(24>>3);//24/2^3 = 3
System.out.println(24>>>3);
System.out.println("-------------------------");
//如果是负数呢?
System.out.println(-24>>3);//-3
System.out.println(-24>>>3);//??
}
}
/*
模拟一下 计算机底层
3 int 4
00000000 00000000 00000000 00000011 原码
00000000 00000000 00000000 00000011
<< (00)000000 00000000 00000000 0000001100
000000 00000000 00000000 0000001100 最后结果的补码
原码补码一样
12
System.out.println(-24>>3);//-3
右移: >>
-24 int 4
10000000 00000000 00000000 00011000 原码
11111111 11111111 11111111 11100111 反码
11111111 11111111 11111111 11101000 补码
11111111 11111111 11111111 11101000
>> 11111111111 11111111 11111111 11101(000)
补码 11111111111 11111111 11111111 11101
反码 11111111111 11111111 11111111 11100
原码 10000000000 00000000 00000000 00011
(-3)
System.out.println(-24>>>3);//??
10000000 00000000 00000000 00011000 原码
11111111 11111111 11111111 11100111 反码
11111111 11111111 11111111 11101000 补码
11111111 11111111 11111111 11101000
>>> 00011111111 11111111 11111111 11101(000) 补码
原码 00011111111 11111111 11111111 11101
*/
/*
己实现两个整数变量的交换
1:想法 找个中间量
利用中间变量
*/
class OperatorTest{
public static void main(String[] args) {
int a = 20;
int b = 40;
//通过中间变量来实现 开发中就这么用 这是今天必须要掌握的内容
/*
//必须掌握的
int temp = a;
a=b;
b=temp;
//通过异或
//左边 a,b,a 右边 a^b
//要把结论记住的
a = a^b;// a:20^40 b:40
b = a^b;// 20^40^40 = 20 b:20 a:20^40
a = a^b;// 20^40^20 =40 a:40 b:20
*/
//了解的 最好理解
//a = a+b;// a :60 b:40
//b = a-b;// 60-40 = 20 b:20
//a = a-b;// 60-20 = 40 a:40
//还有一种 一句话 ,面试之前背一下
b = (a+b)-(a=b);//a:40
// 60 - 40 =20
System.out.println("a:"+a);
System.out.println("b:"+b);
System.out.println(0.09 + 0.01);
}
}
转载于:https://blog.51cto.com/hexudong/1770830