/*java
位運算 二進制 補碼面試
基本的 &(與) |(或) ^(異或) ~(按位取反)ide
鏈接的是數值(除了布爾類型的)spa
通常咱們作案例,用的數據都是採用整數 (int)開發
*/it
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); } }
/*class
模擬底層運算:效率
二進制 的補碼變量
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); } }