- Swift 5從零到精通iOS開發訓練營
- 張益琿編著
- 1430字
- 2022-07-27 18:32:15
6.1 位運算符與溢出運算符
很多編程語言都支持位運算符,位運算符的主要功能是對二進制數據進行位運算等操作。而溢出運算符是Swift語言獨有的,由于Swift語言對代碼安全性的注重,正常的運算是不允許出現溢出行為的,開發者使用溢出運算符可以控制是否允許溢出運算。
6.1.1 位運算符的應用
在計算機中,數據都是以二進制的形式存儲的,位運算是專門針對二進制數據的一種運算方式。在Swift語言中,開發者在創建數值變量時可以通過追加“0b”前綴的方式將數值設置為二進制。使用Xcode開發工具創建一個名為AdvancedOperators的Playground文件,在其中進行代碼演示。創建一個UInt8類型的變量,將十進制數8以二進制的方式賦值,示例如下:
//十進制數8 var a:UInt8 = 0b1000
前面介紹過UInt8類型,其為8位的無符號整型,也就是說,任何一個UInt8類型的變量都是采用8個二進制位來存儲數據的。因此,讀者可以理解為a變量實際存儲的數據為00001000。位運算的實質是對數據的每一個二進制位進行邏輯運算。
Swift語言支持C/Objective-C語言中的全部位運算符,其中包括按位取反運算、按位與運算、按位或運算、按位異或運算、按位左移運算以及按位右移運算。
按位取反運算符“~”的作用是將數據的每一位都進行取反操作,即如果當前位為0,則運算后變為1,如果當前位為1,則運算后變為0。對上面創建的變量a進行按位取反運算后,其存儲的數據將變為11110111,即十進制數247,示例如下:
//運算后 a 的值變為十進制數247 a = ~a
按位與運算符“&”需要有兩個操作數,其作用是將兩個操作數相同的位進行邏輯與運算。即如果兩個對應位的值都為1,則運算后此位結果為1;如果其中有一個位的值為0,則運算后此位結果為0。示例如下:
//使用二進制數11110000與a進行按位與運算,運算結果為11110000,即十進制數240 a = 0b11110000&a
按位或運算符“|”需要有兩個操作數,其作用是將兩個操作數相同的位進行邏輯或運算。即如果兩個對應位的值有一個為1,則運算后此位結果為1;如果兩個對應位的值都為0,則運算后此位結果為0。示例如下:
//使用二進制數11111111與a進行按位或運算,結果為11111111,即十進制數255 a = 0b11111111|a
按位異或運算符“^”需要有兩個操作數,其作用是將兩個操作數相同的位進行邏輯異或運算。即如果兩個對應位的值相同,則運算后此位的值為0;如果兩個對應位的值不同,則運算后結果為1。示例如下:
//使用二進制數11110000與a進行按位異或運算,結果為00001111,即十進制數15 a = 0b11110000^a
按位左移運算符“<<”用于將數據每一位上的值進行左移操作,示例如下:
//將a按位左移1位,結果為00011110,即十進制數30 a = a<<1
與按位左移運算對應,按位右移運算符“>>”用于將數據每一位上的值進行右移操作,示例如下:
//將a按位右移1位,結果為00001111,即十進制數15 a = a>>1
提示
進行按位左移或者右移運算的時候,有可能出現丟失數據位的情況,例如對于UInt8類型,將二進制數據00001111向左移動6位,結果為11000000;將二進制數據11110000向右移動6位,結果為00000011。
6.1.2 溢出運算符
Swift語言十分注重安全性,在編寫代碼時,如果出現了數據溢出,會直接出現運行時錯誤。而溢出運算符這種設計將代碼的不確定性降低了很多。所謂溢出,是指超出數據所屬類型的最大值或者最小值。以UInt8來說,其最大值為二進制數11111111,即十進制數255。如果將UInt8類型的變量設置為255后再將其加1,就會出現數據溢出,示例如下:
var b:UInt8 = 255 //代碼運行到這里會出現錯誤,運行直接中斷 b = b+1
如果開發者確實需要溢出操作,而不是無意留下的小錯誤,Swift語言中也提供了支持溢出操作的溢出操作符,示例如下:
var b:UInt8 = 255 //進行支持溢出的加操作,b的值將變為0 b = b &+ 1 //進行支持溢出的減操作,b的值將變為255 b = b &- 1 //進行支持溢出的乘操作,b的值將變為254 b = b &* 2
提示
對二進制數據進行乘2運算,實質上就是對二進制數據進行左移一位的運算,例如二進制數據11111111*2=11111110。
- 計算思維與算法入門
- Clojure for Domain:specific Languages
- Java Web應用開發技術與案例教程(第2版)
- Learning Python Design Patterns
- Highcharts Cookbook
- 用戶體驗增長:數字化·智能化·綠色化
- C++語言程序設計
- Kotlin進階實戰
- Java Hibernate Cookbook
- Drupal Search Engine Optimization
- 你必須知道的.NET(第2版)
- Raspberry Pi Robotic Projects
- Distributed Computing with Python
- 分布式系統架構與開發:技術原理與面試題解析
- 數據庫技術及應用教程上機指導與習題(第2版)