無論Java還是C++,都分為以下幾種運算子:算術運算子,關系運算子,邏輯運算子,位運算子等,接下來我就對Java中的這些運算子進行簡單的講解,
一、算術運算子
我們常用的算數運算子有以下幾個:
| 運算子 | 描述 |
|---|---|
| + | 加法運算 |
| - | 減法運算 |
| * | 乘法運算 |
| / | 除法運算 |
| % | 取余運算:左運算元除以右運算元的余數 |
| ++ | 自增1運算 |
| – | 自減1運算 |
這里+、-、* 與我們的數學運算規則完全相同,我就不做講解了,
%一般用于整數的求余操作,有時也叫取模,
/ 的左右運算元都是整數時表示整數除法(結果只取整數部分),否則表示浮點除法,
需要注意的是,整數被0除將會產生一個例外,而浮點數被0除會得到一個結果(無窮大或NaN)

二元算術運算子 += -= %=
我們也可以在賦值陳述句中采用一種簡化的格式書寫二元算術運算子,
例如 x+=4 等價于 x=x+4
我們通常將算術運算子放在賦值符號的左側進行拼接(*=,/=,%=,+=,-=)

自增/自減運算子 ++ - -
在程式編程中,加1和減1是數值變數最常見的操作,Java也借鑒C++的實作方式,使用自增++ 與自減-- 的運算子實作變數加減1的操作,
例如 :int n=3;n++
那么n的值將變為4,因為運算子會改變變數的值,所以這里的運算元不能是數值,所以4++就是一條非法陳述句,
其實自增++ 和自減-- 分兩種情況:
前綴形式:++n;- -n(運算式使用改變后的值)
后綴形式:n++;n- -(運算式使用改變前的值)
這兩種形式使變數本身的值改變是一樣的,但是對使用它們的運算式會產生不一樣的結果,在下面的示例里可以清晰的看到區別,

盡管了解了區別,但我不建議在其他運算式里使用自增/自減運算子,這不止會使代碼變的難懂,還有可能產生其他bug,
二、關系運算子

這里的==用于判斷運算子兩側是否相等,要與賦值運算子 = 區分開,對于關系運算子的回傳結果只有true/false 兩種,賦值運算子就不一樣,

邏輯運算子 && || !
另外Java沿用C++的習慣,也使用邏輯運算子:與、或、非,并且使用“短路”的方式求值:如果第一個運算元已經可以判斷整個運算式的值,那么第二個運算元就不必計算了,

“短路”方式例如&&運算,如果左運算元為false,那么就不會繼續計算右運算元,
對于下面的示例表現為 a/0 不報錯(正常情況下-除數不能為0,否則程式報錯),

“短路”方式例如|| 運算,如果左運算元為true,那么就不會繼續計算右運算元,
!非運算,大家很熟悉,也不用多講了,
三元運算子 ?:
三元運算子指 ?: 表示當?的條件為真時計算第一個運算式,否則計算第二個,
例如運算式 return x<y?x:y;表示回傳x,y中較小的數值,
在很多時候,這個運算子使我們的程式更加簡化了,是一個非常好用的運算子,

位運算子

按位的與& 或| 運算很簡單,這里的位指的就是二進制位,所以我們只要把數值用二進制表示就能得到結果,
具體示例如下:

計算程序如下:

非運算子 ~
~運算的運算規則:如果位為0,結果是1,如果位為1,結果是0,非運算子是一元運算子,
具體示例:a=2,~a=-3(具體計算涉及補碼的知識點,看不懂得可以了解一下補碼)

計算程序如下:
這里簡單說一下: 正數的原碼,反碼,補碼都一樣;負數的反碼是對除了符號位(最高位)對原碼取反,補碼是對反碼+1,對于負數計算機存盤的都是補碼,所以我們要計算此負數的原始碼,即原始碼等于(符號位不變)補碼減一再取反,

異或運算子 ^
^運算的運算規則:兩個運算元的位中,相同則結果為0,不同則結果為1,異或運算子是二元運算子,
具體示例如下:

計算程序也比較簡單:

移位運算子 >>右移 << 左移
<< : 左移運算子,num << 1,相當于num乘以2
>> : 右移運算子,num >> 1,相當于num除以2
>>> : 無符號右移,忽略符號位,空位都以0補齊
具體示例為:
這里需要說明的是,正數在輸出二進制表示時,左面的0不輸出;負數輸出二進制位時要輸出完整的32位

計算程序如下:
這里要注意的時,對移位運算子右側的引數需要做模32的操作,即1<<35與1<<3的運算結果是一樣的,

位運算子的實際應用
位運算子比加減運算子運算速度更快,一般能用位運算的就用位運算子,
尤其2,/2 的運算,可換成<<和>>,
運算子的優先級:
后綴(()[].) > 一元(++ – - ! ~)> 乘性(/%)> 加性(+ -)> 位移(>> << >>>)> 關系(> >= < <=)> 相等(== !=)> &> ^> |> ?:> 賦值(=,+=等)> 逗號
計算整數二進制表示中1的個數
題目:輸入一個整數,輸出該數二進制表示中1的個數,如:9的二進制表示是1001,有2位是1,因此如果輸入9,該函式輸出2,
第一種思路:使用 >> 運算子,將資料右移,不斷與數字 1做與 & 運算,若與運算的結果為1,則表示該位置二進制為1,number++;否則位置上為0,繼續判斷下一位,

細心的讀者可能會發現,代碼里我使用的右移是>>>而不是>>,因為我在寫代碼時,突然想到,如果這里n是負數,用>>右移的話,最左面補位補的是1,一直右移就一直補1會造成死回圈 (1000)>>(1100)>>(1110)>>(1111)>>…>>1111,而使用>>>就不會出現問題了,因為此時無論n為正負數,在右移操作中都會補0,while總會停止,
思路二:對于任意資料n,n-1操作是將n的二進制表示中,最右面的1變為0,且最右面1的后面部分全取反,n=n & (n-1),則是將n的二進制表示中,最右面的1的后面全變為0,利用這一特性,統計二進制表示中1的個數,

判斷一個整數是不是2的整數次方

判斷兩個整數m和n,計算需要改變m的二進制表示中的多少位才能得到n

不使用加減乘除,完成兩個數字的加法操作

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/257794.html
標籤:其他
