与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