?運(yùn)算符的作用是操縱對(duì)象和數(shù)據(jù),它以一個(gè)或多個(gè)變量為基礎(chǔ),生成新的值汹买。
?運(yùn)算符具有優(yōu)先級(jí)和結(jié)合性。優(yōu)先級(jí)決定一個(gè)表達(dá)式存在多個(gè)運(yùn)算符時(shí)各部分的計(jì)算順序聊倔。結(jié)合性決定了在相同優(yōu)先級(jí)的情況下是從左到右(左結(jié)合)還是從右到左(右結(jié)合)晦毙。Kotlin中運(yùn)算符優(yōu)先
級(jí)和結(jié)合性參見下表(數(shù)字越小遏乔,優(yōu)先級(jí)越高):
符號(hào) | 優(yōu)先級(jí) | 結(jié)合性 | 目數(shù) | 說明 |
---|---|---|---|---|
. | 1 | 從左到右 | 雙目 | 點(diǎn) |
() | 1 | 從左到右 | 雙目 | 小括號(hào) |
[] | 1 | 從左到右 | 雙目 | 中括號(hào) |
++ | 2 | 從右到左 | 單目 | 前綴增 |
-- | 2 | 從右到左 | 單目 | 前綴減 |
+ | 2 | 從右到左 | 單目 | 正號(hào) |
- | 2 | 從右到左 | 單目 | 負(fù)號(hào) |
++ | 2 | 從右到左 | 單目 | 后綴增 |
-- | 2 | 從右到左 | 單目 | 后綴減 |
狼钮! | 2 | 從右到左 | 單目 | 邏輯非 |
* | 3 | 從左到右 | 雙目 | 乘法 |
/ | 3 | 從左到右 | 雙目 | 除法 |
% | 3 | 從左到右 | 雙目 | 取余 |
+ | 4 | 從左到右 | 雙目 | 加法 |
- | 4 | 從左到右 | 雙目 | 減法 |
< | 5 | 從左到右 | 雙目 | 小于 |
<= | 5 | 從左到右 | 雙目 | 小于等于 |
> | 5 | 從左到右 | 雙目 | 大于 |
>= | 5 | 從左到右 | 雙目 | 大于等于 |
== | 6 | 從左到右 | 雙目 | 等于 |
!= | 6 | 從左到右 | 雙目 | 不等于 |
&& | 7 | 從左到右 | 雙目 | 邏輯與 |
|| | 8 | 從左到右 | 雙目 | 邏輯或 |
= | 9 | 從左到右 | 雙目 | 賦值 |
+= | 9 | 從左到右 | 雙目 | 復(fù)合賦值運(yùn)算符加 |
-= | 9 | 從左到右 | 雙目 | 復(fù)合賦值運(yùn)算符減 |
*= | 9 | 從左到右 | 雙目 | 復(fù)合賦值運(yùn)算符乘 |
/= | 9 | 從左到右 | 雙目 | 復(fù)合賦值運(yùn)算符除 |
%= | 9 | 從左到右 | 雙目 | 復(fù)合賦值運(yùn)算符取余 |
熟悉Java的同學(xué)從上表中并沒有看到 |
凑懂、&
城豁、^
迄埃、~
和移位相關(guān)的操作符湘捎。在Kotlin中通過 and
葛虐、or
驮审、xor
和 inv()
實(shí)現(xiàn)位操作钱豁;通過 shr
耻卡、shl
、ushr
實(shí)現(xiàn)移位操作牲尺,并且沒有移位賦值操作符卵酪。
?實(shí)際操作中為了方便閱讀,明確執(zhí)行順序谤碳,一般通過添加括號(hào)而不是依賴運(yùn)算符的優(yōu)先級(jí)來控制計(jì)算順序溃卡。
1.賦值運(yùn)算符 =
=
將符號(hào)右邊的值復(fù)制到左邊。右邊的值可以是變量蜒简、常量 和任何表達(dá)式瘸羡。比如:
val a = 5
var b = 3 + 45
2.算術(shù)運(yùn)算符 +
、-
搓茬、*
最铁、/
讯赏、%
基本算術(shù)運(yùn)算符都是一樣的這里就不再多說,下面舉幾個(gè)代碼實(shí)例:
val num1 = 3
val num2 = 4
val i = num1 + num2 // i = 3 + 4 = 7
val j = num1 - num2 // j = 3 - 4 = -1
val k = num1 * num2 // k = 3 * 4 = 12
val m = num1 / num2 // m = 3 / 4 = 0
val n = num1 % num2 // n = 3 % 4 = 3
一元運(yùn)算符 +
和 -
冷尉。 +
保持變量原值漱挎。 -
修改變量值為原值的相反數(shù)。
val a = -46
val b = +a // b= -46
val c = -a // c = 46
3.關(guān)系運(yùn)算符>
雀哨、>=
磕谅、<
、<=
雾棺、!=
膊夹、==
其中 >
、>=
捌浩、<
放刨、<=
適用于所有實(shí)現(xiàn)了 Comparable 接口的對(duì)象,!=
尸饺、==
適用于任何對(duì)象进统。下面給出一些示例代碼:
var i = 23
var j = 12
println(i < j) // 輸出結(jié)果為 false
println(i >= j) // 輸出結(jié)果為 true
val a = Integer(5)
val b = Integer(5)
println(a == b) // 輸出結(jié)果為 true
println(a != b) // 輸出結(jié)果為 false
4.邏輯運(yùn)算符||
、&&
浪听、!
邏輯運(yùn)算符只適用于 Boolean 或者 boolean類型螟碎, 經(jīng)過它運(yùn)算后生成一個(gè)布爾值。比如:
val b = false
println(!b) // 輸出true
var k = 23
val c = b || k>2 && k ==23
println(c) // 輸出true
5.位運(yùn)算符
Kotlin中使用 or
迹栓、and
掉分、xor
操作符和方法inv() 分別表示按位 或 、 與克伊、異或 酥郭、求反操作。示例代碼:
var i = 0b0011 // 十進(jìn)制數(shù)3
var j = 0b1010 // 十進(jìn)制數(shù)10
println(i or j) // 11
println(i and j) // 2
println(i xor j) // 9
println(i.inv()) // -4
補(bǔ)充:
機(jī)器數(shù):
?數(shù)字在計(jì)算機(jī)中二進(jìn)制表示的方式愿吹,叫做這個(gè)數(shù)的機(jī)器數(shù)褥民。高位用于存放數(shù)字的符號(hào),0表示正數(shù)洗搂,1表示負(fù)數(shù).
真值:
?帶符號(hào)位的機(jī)器數(shù)對(duì)應(yīng)的真正數(shù)值稱為機(jī)器數(shù)的真值。比如载弄,有符號(hào)數(shù) 10000001 的真值為 -1耘拇, 而不是2^7 +1 = 129。00000001 的真值為 1.
原碼:
?原碼定義為符號(hào)位加上真值的絕對(duì)值宇攻。比如惫叛,+2 的原碼為 00000010,; -2 的原碼為 10000010 逞刷。
反碼:
?反碼定義: 1. 如果是正數(shù)嘉涌,那么其反碼就是原碼本身妻熊; 2.如果是負(fù)數(shù),那么原碼符號(hào)位不變仑最,其余各位取反扔役。 比如 +2 原碼為 00000010 , 反碼為 00000010警医; -2 原碼為 10000010 亿胸, 反碼為 11111101。
補(bǔ)碼:
?補(bǔ)碼定義:1. 如果是正數(shù)预皇,那么其補(bǔ)碼就是原碼本身侈玄; 2.如果是負(fù)數(shù),那么原碼符號(hào)位不變吟温,其余各位取反序仙,最后 +1 。 比如 +2 原碼為 00000010 鲁豪, 反碼為 00000010潘悼; -2 原碼為 10000010 , 補(bǔ)碼為 11111110呈昔。由于計(jì)算機(jī)中存儲(chǔ)的是數(shù)值的補(bǔ)碼挥等,針對(duì)示例代碼中變量:
i = 0b0011 , 其完整的二進(jìn)制(int類型用 32 位 2 進(jìn)制表示)表示為:
0000 0000 0000 0000 0000 0000 0000 0011
j = 0b1010 , 其完整的二進(jìn)制表示為:
0000 0000 0000 0000 0000 0000 0000 1010
or (按位或)操作:
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 1011 => 2^3 + 2^1 + 1 = 11
and (按位與)操作:
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 0010 => 2^1 = 2
xor (按位異或)操作:
0000 0000 0000 0000 0000 0000 0000 0011
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 1001 => 2^3 + 1 = 9
inv()(按位求反)操作:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1100 => - 2^2 = -4
6.移位運(yùn)算符
Kotlin中使用 shr
堤尾、shl
肝劲、ushr
操作符實(shí)現(xiàn)移位操作,并且沒有移位賦值符合運(yùn)算符郭宝〈腔保可用下面的方案來測(cè)試了解各個(gè)操作符的作用:
var i = 0b0111 // 十進(jìn)制數(shù)7
println(i shr 2)
println(i shl 2) // 左移,相當(dāng)于 2^n * i , n 移位位數(shù) 粘室, i操作數(shù)
println(i ushr 2)
var j = -0b111 // 十進(jìn)制數(shù) -7
println(j shr 2) // 有符號(hào)右移榄檬,最左邊用符號(hào)位填充
println(j shl 2)
println(j ushr 2) // 無符號(hào)右移,最左邊位用0填充衔统,負(fù)數(shù)變正數(shù)
補(bǔ)充:相同的鹿榜,針對(duì)移位操作示例代碼中的變量:
i = 0b0111 , 其完整的二進(jìn)制表示為:
0000 0000 0000 0000 0000 0000 0000 0111
shr 2 , 有符號(hào)右移兩位, 最左邊用符號(hào)位填充 锦爵, 結(jié)果為:
0000 0000 0000 0000 0000 0000 0000 0001 => 1
shl 2, 左移兩位舱殿, 最右邊用 0 填充 , 結(jié)果為:
0000 0000 0000 0000 0000 0000 0001 1100 => 2^4 + 2^3 + 2^2 = 28
ushr 2, 無符號(hào)右移兩位险掀, 最左邊用 0 填充 沪袭, 結(jié)果為:
0000 0000 0000 0000 0000 0000 0000 0001 => 1
j = -0b0111 , 其完整的二進(jìn)制表示為:
1111 1111 1111 1111 1111 1111 1111 1001
shr 2 , 有符號(hào)右移兩位, 最左邊用符號(hào)位填充 樟氢, 結(jié)果為:
1111 1111 1111 1111 1111 1111 1111 1110 => -2
shl 2, 左移兩位冈绊, 最右邊用 0 填充 侠鳄, 結(jié)果為:
1111 1111 1111 1111 1111 1111 1110 0100 => - 28
ushr 2, 無符號(hào)右移兩位, 最左邊用 0 填充 死宣, 結(jié)果為:
0011 1111 1111 1111 1111 1111 1111 1110 => 1073741822
示例代碼中幾乎包含了所有的運(yùn)算符伟恶,特別需要注意關(guān)系運(yùn)算符和邏輯運(yùn)算符中的示例代碼。