美文网首页
高级运算符

高级运算符

作者: 大好河山_ | 来源:发表于2017-12-13 13:24 被阅读0次
与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

相关文章

  • 第二十四节 Swift 高级运算符

    除了加减乘除运算符,常用的位运算符在 Swift里属于高级运算符。 其它的高级运算符还有移位运算符和溢出加法运算符...

  • 26_高级运算符

    除了基本运算符,Swift 中还有许多可以对数值进行复杂运算的高级运算符。这些高级运算符包含了在位运算符和移位运算...

  • Swift编程二十八(高级运算符)

    案例代码下载 高级运算符 除了基本运算符中描述的运算符之外,Swift还提供了几个执行更复杂值操作的高级运算符。这...

  • swift2.2 - 高级运算符

    高级运算符 文档地址 作为 基本运算符 的补充,Swift 提供了几个高级运算符执行对数传值进行更加复杂的操作。这...

  • 26 高级运算符

    高级运算符 除了Basic Operators中描述的基本运算符之外,Swift还提供了几个执行更复杂值操作的高级...

  • 27、【Swift】高级运算符 - Advanced Opera

    Swift 运算符基本运算符高级运算符(包括 C 或 Objective-C 所有按位和移位运算符。) 与 C 的...

  • 高级运算符

    运算符语法 在运算符,冒号和搜索项之间没用空格。 运算符搜素的部分遵从google的基本语法 高级运算符能和一个单...

  • Advanced Operators

    高级运算符。不同于C,swfit中的运算符默认是不可溢出的,溢出会报错。你可以使用&加运算符表示可溢出运算符。 按...

  • 5.1 高级运算符与枚举

    除了算术运算符、逻辑运算符等基础的运算符外,Swift语言还提供了许多关于运算符的高级使用技巧。开发者甚至可以重新...

  • Swift - 高级运算符

    高级运算符 除了之前介绍过的 基本运算符[https://www.jianshu.com/p/36d7fb4525...

网友评论

      本文标题:高级运算符

      本文链接:https://www.haomeiwen.com/subject/pflklxtx.html