Kotlin从0到1——运算符

 运算符的作用是操纵对象和数据,它以一个或多个变量为基础,生成新的值。
 运算符具有优先级和结合性。优先级决定一个表达式存在多个运算符时各部分的计算顺序。结合性决定了在相同优先级的情况下是从左到右(左结合)还是从右到左(右结合)。Kotlin中运算符优先
级和结合性参见下表(数字越小,优先级越高):

符号 优先级 结合性 目数 说明
. 1 从左到右 双目
() 1 从左到右 双目 小括号
[] 1 从左到右 双目 中括号
++ 2 从右到左 单目 前缀增
-- 2 从右到左 单目 前缀减
+ 2 从右到左 单目 正号
- 2 从右到左 单目 负号
++ 2 从右到左 单目 后缀增
-- 2 从右到左 单目 后缀减
2 从右到左 单目 逻辑非
* 3 从左到右 双目 乘法
/ 3 从左到右 双目 除法
% 3 从左到右 双目 取余
+ 4 从左到右 双目 加法
- 4 从左到右 双目 减法
< 5 从左到右 双目 小于
<= 5 从左到右 双目 小于等于
> 5 从左到右 双目 大于
>= 5 从左到右 双目 大于等于
== 6 从左到右 双目 等于
!= 6 从左到右 双目 不等于
&& 7 从左到右 双目 逻辑与
|| 8 从左到右 双目 逻辑或
= 9 从左到右 双目 赋值
+= 9 从左到右 双目 复合赋值运算符加
-= 9 从左到右 双目 复合赋值运算符减
*= 9 从左到右 双目 复合赋值运算符乘
/= 9 从左到右 双目 复合赋值运算符除
%= 9 从左到右 双目 复合赋值运算符取余

熟悉Java的同学从上表中并没有看到 |&^~ 和移位相关的操作符。在Kotlin中通过 andorxorinv() 实现位操作;通过 shrshlushr 实现移位操作,并且没有移位赋值操作符。
 实际操作中为了方便阅读,明确执行顺序,一般通过添加括号而不是依赖运算符的优先级来控制计算顺序。

1.赋值运算符 =

= 将符号右边的值复制到左边。右边的值可以是变量、常量 和任何表达式。比如:

val a = 5              
var b = 3 + 45

2.算术运算符 +-*/%

基本算术运算符都是一样的这里就不再多说,下面举几个代码实例:

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

一元运算符 +-+保持变量原值。 -修改变量值为原值的相反数。

val a = -46
val b = +a   // b= -46
val c = -a    // c = 46

3.关系运算符>>=<<=!===

其中 >>=<<= 适用于所有实现了 Comparable 接口的对象,!===适用于任何对象。下面给出一些示例代码:

var i = 23
var j = 12
println(i  < j)          // 输出结果为 false
println(i >= j)         // 输出结果为 true
val a = Integer(5)
val b = Integer(5)
println(a == b)     // 输出结果为 true
println(a != b)     // 输出结果为 false

4.逻辑运算符||&&!

逻辑运算符只适用于 Boolean 或者 boolean类型, 经过它运算后生成一个布尔值。比如:

val b = false
println(!b)  // 输出true
var k = 23
val c = b || k>2 && k ==23  
println(c)  // 输出true

5.位运算符

Kotlin中使用 orandxor 操作符和方法inv() 分别表示按位 或 、 与、异或 、求反操作。示例代码:

var i = 0b0011   // 十进制数3
var j = 0b1010 // 十进制数10
println(i or j)     // 11
println(i and j)  //  2
println(i xor j)   //  9
println(i.inv())   //  -4

补充:
机器数:
 数字在计算机中二进制表示的方式,叫做这个数的机器数。高位用于存放数字的符号,0表示正数,1表示负数.
真值:
 带符号位的机器数对应的真正数值称为机器数的真值。比如,有符号数 10000001 的真值为 -1, 而不是2^7 +1 = 129。00000001 的真值为 1.
原码:
 原码定义为符号位加上真值的绝对值。比如,+2 的原码为 00000010,; -2 的原码为 10000010 。
反码:
 反码定义: 1. 如果是正数,那么其反码就是原码本身; 2.如果是负数,那么原码符号位不变,其余各位取反。 比如 +2 原码为 00000010 , 反码为 00000010; -2 原码为 10000010 , 反码为 11111101。
补码:
 补码定义:1. 如果是正数,那么其补码就是原码本身; 2.如果是负数,那么原码符号位不变,其余各位取反,最后 +1 。 比如 +2 原码为 00000010 , 反码为 00000010; -2 原码为 10000010 , 补码为 11111110。由于计算机中存储的是数值的补码,针对示例代码中变量:
i = 0b0011 , 其完整的二进制(int类型用 32 位 2 进制表示)表示为:
0000 0000 0000 0000 0000 0000 0000 0011
j = 0b1010 , 其完整的二进制表示为:
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.移位运算符

Kotlin中使用 shrshlushr 操作符实现移位操作,并且没有移位赋值符合运算符。可用下面的方案来测试了解各个操作符的作用:

var i = 0b0111   // 十进制数7
println(i shr 2)
println(i shl 2)  // 左移,相当于 2^n * i , n 移位位数 , i操作数
println(i ushr 2)
var j = -0b111   // 十进制数 -7
println(j shr 2)    // 有符号右移,最左边用符号位填充
println(j shl 2)
println(j ushr 2)   // 无符号右移,最左边位用0填充,负数变正数

补充:相同的,针对移位操作示例代码中的变量:
i = 0b0111 , 其完整的二进制表示为:
0000 0000 0000 0000 0000 0000 0000 0111
shr 2 , 有符号右移两位, 最左边用符号位填充 , 结果为:
0000 0000 0000 0000 0000 0000 0000 0001 => 1
shl 2, 左移两位, 最右边用 0 填充 , 结果为:
0000 0000 0000 0000 0000 0000 0001 1100 => 2^4 + 2^3 + 2^2 = 28
ushr 2, 无符号右移两位, 最左边用 0 填充 , 结果为:
0000 0000 0000 0000 0000 0000 0000 0001 => 1
j = -0b0111 , 其完整的二进制表示为:
1111 1111 1111 1111 1111 1111 1111 1001
shr 2 , 有符号右移两位, 最左边用符号位填充 , 结果为:
1111 1111 1111 1111 1111 1111 1111 1110 => -2
shl 2, 左移两位, 最右边用 0 填充 , 结果为:
1111 1111 1111 1111 1111 1111 1110 0100 => - 28
ushr 2, 无符号右移两位, 最左边用 0 填充 , 结果为:
0011 1111 1111 1111 1111 1111 1111 1110 => 1073741822

示例代码中几乎包含了所有的运算符,特别需要注意关系运算符和逻辑运算符中的示例代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容