高级运算符

与C语言中的算术运算符不同,Swift中的算术运算符默认是不会溢出的,
溢出加法运算符(&+),所有的这些溢出运算符都是以&开头的;

1:位运算

位运算符可以操作数据结构中每个独立的比特位。它们通常被用在底层
开发中,比如图形编程和创建设备驱动。位运算符在处理外部资源的原
始数据时也十分有用,比如对自定义通信协议传输的数据进行编码和解
码;

1.1:按位取反运算符(~)

可以对一个数值的全部比特位取反;

例子

let test: UInt8 = 0b00001111
let test1= ~test // 等于 0b11110000


UInt8类型的整数有8个比特位,可以存储0~255之间的任意整数,test无符号十进制数的是15;
test取反以后,即所有的0都变成了1 ,同时所有的1都变成0,所以test1的无符号十进制数的240;

1.2:按位与运算符

按位与运算符(&)可以对两个数的比特位进行合并。它返回一个新的数,
只有当两个数的对应位都为1的时候,新数的对应位才为1;

例子

let firstBits: UInt8 = 0b11111100
let lastBits: UInt8 = 0b00111111
let middleBits = firstSixBits & lastSixBits// 等于 00111100

1.3:按位或运算符

按位或运算符(|)可以对两个数的比特位进行比较。它返回一个新的数,
只要两个数的对应位中有任意一个为1时,新数的对应位就为1;

例子

let someBits: UInt8 = 0b10110010
let moreBits: UInt8 = 0b01011110
let combinedbits = someBits | moreBits // 等于 11111110

1.4:按位异或运算符

按位异或运算符(^)可以对两个数的比特位进行比较。它返回一个新的
数,当两个数的对应位不相同时,新数的对应位就为1;

例子

let firstBits: UInt8 = 0b00010100
let otherBits: UInt8 = 0b00000101
let outputBits = firstBits ^ otherBits // 等于 00010001

1.5:按位左移、右移运算符

按位左移运算符( << )和按位右移运算符( >> )可以对一个数的所有位进
行指定位数的左移和右移,但需要遵守如下规则对一个数进行按位左移
或按位右移,相当于对这个数进行乘以2或除以2的运算。将一个整数左
移一位,等价于将这个数乘以2,同样地,将一个整数右移一位,等价
于将这个数除以2。

1.6:无符号整数的移位运算规则

1:已经存在的位按指定的位数进行左移和右移;
2:任何因移动而超出整型存储范围的位都会被丢弃;
3:用 0 来填充移位后产生的空白位;

例子

let infoBits:UInt8 = 4 // 即二进制的 00000100

infoBits << 1          // 00001000
infoBits << 2          // 00010000
infoBits << 5          // 10000000
infoBits << 6          // 00000000
infoBits >> 2          // 00000001

2:溢出运算符

在默认情况下,当向一个整数赋予超过它容量的值时,Swift默认会报
错,而不是生成一个无效的数。这个行为为我们在运算过大或着过小的
数的时候提供了额外的安全性。

1:溢出加法&+

let unsignedOverflow = UInt8.max
unsignedOverflow = unsignedOverflow &+ 1 //此时unsignedOverflow等于0

unsignedOverflow被初始化为UInt8所能容纳的最大整数(255 ,以二进
制表示即11111111)。然后使用了溢出加法运算符(&+)对其进行加1运算,
这使得它的二进制表示正好超出UInt8所能容纳的位数,也就导致了数
值的溢出,留在UInt8边界内的值是00000000,也就是十进制数值的;
0。

3:优先级和结合性

运算符的优先级使得一些运算符优先于其他运算符,高优先级的运算符
会先被计算;结合性定义了相同优先级的运算符是如何结合的;

4:位运算函数

类和结构体可以为现有的运算符提供自定义的实现,这通常被称为运算符重载。

自定义实现+号运算符

算术加法运算符是一个双目运算符,因为它可 以对两个值进行运算,
同时它还是中缀运算符,因为它出现在两个值中间。
struct Vector2D {
var x = 0.0, y = 0.0
}

extension Vector2D {
static func + (left: Vector2D, right: Vector2D) -> Vector2D {
return Vector2D(x: left.x + right.x, y: left.y + right.y)
}
}

该运算符函数被定义为Vector2D上的一个类方法,并且函数的名字与它
要进行重载的 + 名字一致。因为加法运算并不是一个向量必需的功能,
所以这个类方法被定义在Vector2D的一个扩展中,而不是Vector2D结构
体声明内。而算术加法运算符是双目运算符,所以这个运算符函数接收
两个类型为Vector2D的参数,同时有一个Vector2D类型的返回值。
在这个实现中,输入参数分别被命名为left和right,代表在+运算符左边
和右边的两个Vector2D实例。函数返回了一个新的Vector2D实例,这个
实例的x和y分别等于作为参数的两个实例的x和y的值之和。
这个函数被定义成全局的,而不是Vector2D结构体的成员方法,所以任
意两个Vector2D实例都可以使用这个中缀运算符:

5:范围运算符

a..<b 表示[a,b)包含a不包含b;

a...b:表示[a,b]包含a和b;

6:赋值运算符

6.1:N对N赋值

let(x,y) = (1,2);

将1赋值给x

2赋值给y

与C/OC不一样的是:swift中的赋值运算符是没有返回值的

6.2:求余运算符

9 % 4  == 1

-9 % 4 == -1

9 % -4 ==  1

-9 % -4 == 1

求余的正负数跟%左边的数字的正负是一样的

与C语言不一样的是:Swift的%支持浮点数的计算

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

推荐阅读更多精彩内容