官术网_书友最值得收藏!

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。

主站蜘蛛池模板: 永善县| 连平县| 玛纳斯县| 沁阳市| 汝阳县| 华安县| 孙吴县| 平定县| 苏尼特左旗| 资溪县| 永济市| 柞水县| 壤塘县| 太仆寺旗| 随州市| 灵璧县| 同心县| 韶山市| 额尔古纳市| 江孜县| 林州市| 普兰县| 白朗县| 扎鲁特旗| 黄平县| 清涧县| 沙田区| 泗洪县| 南江县| 龙口市| 广东省| 弥勒县| 定结县| 漾濞| 东城区| 柘荣县| 惠来县| 施甸县| 龙川县| 桐柏县| 方正县|