- Swift 4從零到精通iOS開發
- 張益琿
- 1434字
- 2019-12-09 14:31:27
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。
- Moodle Administration Essentials
- 大學計算機應用基礎實踐教程
- Python語言程序設計
- TypeScript圖形渲染實戰:基于WebGL的3D架構與實現
- 前端HTML+CSS修煉之道(視頻同步+直播)
- Java網絡編程核心技術詳解(視頻微課版)
- ASP.NET程序開發范例寶典
- 快速入門與進階:Creo 4·0全實例精講
- Maker基地嘉年華:玩轉樂動魔盒學Scratch
- 從零學Java設計模式
- 實戰Python網絡爬蟲
- Python編程快速上手2
- Mastering Object:Oriented Python(Second Edition)
- 少兒編程輕松學(全2冊)
- RESTful Web API Design with Node.js(Second Edition)