/*
位运算 二进制 补码
基本的 &(与) |(或) ^(异或) ~(按位取反)
连接的是数值(除了布尔类型的)
一般我们做案例,用的数据都是采用整数 (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); } }
本文出自 “晴空” 博客,谢绝转载!
原文地址:http://hexudong.blog.51cto.com/7169867/1770830