Kotlin從0到1——運(yùn)算符

?運(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驮审、xorinv() 實(shí)現(xiàn)位操作钱豁;通過 shr耻卡、shlushr 實(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)算符中的示例代碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末十电,一起剝皮案震驚了整個(gè)濱河市知押,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鹃骂,老刑警劉巖台盯,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異畏线,居然都是意外死亡静盅,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門寝殴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒿叠,“玉大人,你說我怎么就攤上這事蚣常∈醒剩” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵抵蚊,是天一觀的道長(zhǎng)施绎。 經(jīng)常有香客問我,道長(zhǎng)贞绳,這世上最難降的妖魔是什么谷醉? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮冈闭,結(jié)果婚禮上俱尼,老公的妹妹穿的比我還像新娘。我一直安慰自己萎攒,他們只是感情好遇八,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耍休,像睡著了一般刃永。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羹应,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音次屠,去河邊找鬼园匹。 笑死雳刺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裸违。 我是一名探鬼主播掖桦,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼供汛!你這毒婦竟也來了枪汪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤怔昨,失蹤者是張志新(化名)和其女友劉穎雀久,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趁舀,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赖捌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矮烹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片越庇。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖奉狈,靈堂內(nèi)的尸體忽然破棺而出卤唉,到底是詐尸還是另有隱情,我是刑警寧澤仁期,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布桑驱,位于F島的核電站,受9級(jí)特大地震影響蟀拷,放射性物質(zhì)發(fā)生泄漏碰纬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一问芬、第九天 我趴在偏房一處隱蔽的房頂上張望悦析。 院中可真熱鬧,春花似錦此衅、人聲如沸强戴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骑歹。三九已至,卻和暖如春墨微,著一層夾襖步出監(jiān)牢的瞬間道媚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留最域,地道東北人谴分。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像镀脂,于是被迫代替她去往敵國和親牺蹄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容