java 十 = 0_从零学java笔录-第10篇 数据类型(四)
本文是《凱哥陪你學(xué)系列之java基礎(chǔ)篇》
感謝:
感謝網(wǎng)友:志遠(yuǎn)162。在上一篇中對錯誤指出。
在上篇中模運算正負(fù)號和分子保持一致而不是分母。希望大家記住
本篇主要內(nèi)容:
1:比較運算
2:邏輯運算
3:位運算
4:三元運算
1: 比較運算:
比較運算符:等于,不等于,大于,大于等于,小于,小于等于。
在java中比較兩個數(shù)等于使用的是雙等號。比如 3==2
注意:比較運算符運算的結(jié)果是true或是false。
其中 instanceof這個先不用管。這個以后學(xué)習(xí)中需要的
2 邏輯運算符
Java中邏輯運算
邏輯運算符的作用:
用于連接兩個boolean類型的表達(dá)式。
比如在數(shù)學(xué)中我們 2
但是 如果寫出 x>2,x<5 這兩個表達(dá)式和 2
所以就出現(xiàn)了邏輯運算符。
那么用java表達(dá) x>2 其 x<5怎么表達(dá)?
(x>2 & x<5)這樣就OK了。
代碼演示:
class LogicDemo{
public static void main (String [] args){
int a = 3;
int b = 6;
System.out.println(a>2&a<5);
System.out.println(b>2&b<5);
}
}
運行結(jié)果:
分析原因:
System.out.println(a>2&a<5);為什么是true?
因為: a=3.而3>2.&符號左邊是true 。又因為 3<5 .&符號右邊是true.
所以&符號左右兩邊都是true。所以就是true.
System.out.println(b>2&b<5);為什么是false?
因為: b=6.而6>2.&符號左邊是true 。而右邊 6<5是false.
所以&符號左右兩邊就是 true和false。而輸出的是false.
所以我們可以總結(jié)出&符號的特點
總結(jié)與(&):
&:與 或是叫 且。而且的意思
總結(jié)與(&):
&:與 或是叫 且。而且的意思
文字表達(dá):
true & true = true;
true & false = false;
false & true = false;
false & false = false;
規(guī)律:
&符號:兩邊只要有一邊是false結(jié)果必為false.
只有兩邊都是true,結(jié)果才是true。
總結(jié)與(|)
l:與、或者。就是或者的意思
文字表達(dá):
true & true = true;
true & false = true;
false & true = true;
false & false = true;
規(guī)律:
|符號:兩邊只要有一邊是true結(jié)果必為tr.ue
只有兩邊都是false,結(jié)果才是false。
與和或使用場景
當(dāng)要取中間值或是數(shù)據(jù)(也就是區(qū)間值)的時候使用 & 。
比如 想要3 和4 那么就是 2
當(dāng)要取不是區(qū)間值,使用或
比如 想要不是 3和4 那么就是 x<2 | x>5。取小于2或者是大于5的數(shù)
總結(jié)異或(^)
異或:
true & true = false;
true & false = true;
false & true = true;
false & false = true;
^和|的區(qū)別:
或是 兩邊都是真的時候結(jié)果依然為真
但是異或,兩邊都是真的時候 結(jié)果卻為false.
總結(jié)非運算(!)
非運算取相反的值。
!ture = false;
!false = true;
短路邏輯運算:(面試題)
&& 雙與其特點和單個&特點相同的。
但是只要有一邊為假就不比較另一邊了。
比如:int i = 1;
i>2 && i<5;
這個運算過程就是,先比較 1>2 結(jié)果是false.當(dāng)使用&& 的時候就不在比較右邊了。
但是如果使用& 還需要比較右邊。所以&& 起到短路效果。
|| 和 |的效果是一樣。但是||起到短路效果的。
為什么會出現(xiàn) &&或是是||?
因為這個從效率上來講比單&效率高。
&&和&區(qū)別:
&& 只能做邏輯運算符,起到短路效果。
& 不僅是邏輯運算符還是位運算符。
&:無論左邊結(jié)果是什么,右邊都參與運算。
&&:當(dāng)左邊是false時候,右邊就不參與運算了。
||和|
|:無論左邊結(jié)果是什么,右邊都參與運算
||:如果左邊是真,右邊不參與運算。
|:還是位運算的
位運算符
Java中位運算符:
與運算:
6&3.
因為位運算直接對應(yīng)的是二進制。
而我們知道6和3是int類型。而int類型在內(nèi)存中是4個字節(jié)。32位二進制。
所以,6&3在內(nèi)存中:
簡寫:
分析為什么 6&3 結(jié)果是十進制的2
0:false
1:true
而我們有知道&運算的特點。只要有一個為false結(jié)果必為false.
所以運算的結(jié)果就是二進制的010 對應(yīng)的十進制就是2
同理 6|3 = 7
異或運算:
根據(jù)異或特點:兩邊相同即為假,兩邊不同才為真。
所以 6^3 = 5
6^3^3=6
所以,異或特點:
當(dāng)一個數(shù)異或兩一個數(shù)兩次后,結(jié)果還是這個數(shù)本身。
異或作用:
作為加密的一種方式。
比如數(shù)字6 先用3異或一次后得到新的二進制。然后在網(wǎng)絡(luò)上傳輸。等接受方拿到異或后的新二進制在和3進行異或后,就得到原來的數(shù)據(jù)6了。
反碼:
其實就是取反后的二進制碼
6的反碼(~6): 是-7
理解:
反碼就是取反后在加1.
左移:
3>>2:含義 3左移兩位:
在內(nèi)存中處理過程:
3在內(nèi)存中完整的表示方式:
說明:兩邊的||表示在內(nèi)存中臨界邊。
左移兩位
得到新的二進制就是1100 轉(zhuǎn)成十進制就是12
那么3<<3 = 24
分析原因:
因為這里操作的是二進制。所以左移一位就是2的1次方。左移3位就是2(3)
所以 :
總結(jié):
左移N位其實就是該數(shù)乘以2的N次冪
所以 <
右移:
6>>1 =
6在內(nèi)存中二進制:
右移一位:
右移一位后,最高位就空出一位。注意這里不能直接用0補。
如果是整數(shù),使用0補,如果是負(fù)數(shù)使用1補。
也就是:原數(shù)據(jù)最高位是什么,右移后,最高位和原數(shù)據(jù)最高位相同。
對應(yīng)二進制變成110對應(yīng)的十進制就是3.
6>>2=1
找規(guī)律:
右移N位,其實就是該數(shù)除以2的N次冪
無符號右移:>>>
無符號右移與右移區(qū)別:
無符號右移,無論原數(shù)據(jù)最高位是什么,右移完成后最高位都用0補。
注意:
左移和右移,都操作的是二進制數(shù)據(jù)。
位運算練習(xí):
練習(xí)1:
最優(yōu)效率的方式算出2乘以8等于幾?
內(nèi)存中運算過程
分析得到 8=2(3).8等于2的3次方
所以 2*8 = 2*2(3)
2在內(nèi)存中二進制表現(xiàn):
2(3):2的3次方其實就是2左移3位。即時:2<<3
2的二進制左移三位后:
后面不夠用0補全。
結(jié)果
有效的就是10000對應(yīng)的十進制就是16。
所以代碼:
練習(xí)2:
對兩個整數(shù)變量的值進行互換(注意:不需要第三方變量)
分析:
正常的,使用第三方變量互換原理。
題目明確不能使用第三方變量。
方式1:
int a = 3,b = 5;
分析:
a =? a+b; //此時a = 8
b =? a-b;//此時b = 8-5 = 3
a =? a – b;//因為在上一步 b = 3 所以此時 a = 8-3 = 5.
這樣輸出的 a = 5,b=3.a 和 b就互換了。
雖然使用這種方式也可實現(xiàn)a與b的互換。但是如果a和b都比較大
那么 a+b就有可能超出int范圍。這樣就會出現(xiàn)類型強制轉(zhuǎn)換或是精度丟失的錯誤。
方案二:
使用異或運算。
從上面講解我們知道 一個數(shù)異或另一個數(shù)兩次之后,結(jié)果還是這個數(shù)的本身。
所以:
分析原因:
a = a^b;??? //這個沒什么說的 此時a = a^b了
b = a^b;??? //這個時候因為上一步 a= a^b了。此時 b = ((a^b)^b)。其實 b = a
a = a^b;??? //有第一步 a = a^b ,有第二步 b = a。所以此時 a =( (a^b)^a).其實就是 a =b
將a b數(shù)據(jù)帶入:
三元運算符
三元運算符(三目運算):三個元素參與運算的符號。
代碼:
練習(xí):
需求:比較兩個整數(shù),輸出其中交大的
代碼:
/**
三元運算符練習(xí):
需求:
比較兩個整數(shù),輸出其中交大的
**/
class OperatTest{
public static void main (String [] args){
int a = 5;
int b = 3;
System.out.println("a,b中較大的值為:"+ (a>b?a:b));
}
}
輸出結(jié)果為:
練習(xí)二:
需求:求三個整數(shù)中較大的。
代碼(部分):
//求三個整數(shù)中較大的。
int o =3,p =6,q = 1;
int temp = (o>p?o:p);
int max = temp>q?temp:q;
System.out.println("三個數(shù)中較大的值為:"+ max);
結(jié)果:
ps:歡迎關(guān)注凱哥微信公眾號:凱哥Java
?
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java 十 = 0_从零学java笔录-第10篇 数据类型(四)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 430平方米面积的墙面需要多少方得保温板
- 下一篇: 拉萨凤凰城是哪个开发商?