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

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。

主站蜘蛛池模板: 保德县| 谢通门县| 沾益县| 孟村| 遂溪县| 浮梁县| 山阳县| 长宁区| 曲阜市| 肥东县| 凌云县| 景东| 区。| 新乡市| 和田市| 天水市| 大同市| 徐州市| 黎川县| 团风县| 元阳县| 宣汉县| 宾川县| 南江县| 梅河口市| 古田县| 石嘴山市| 襄垣县| 祥云县| 会昌县| 县级市| 灌阳县| 漠河县| 乌兰浩特市| 汕头市| 广丰县| 五峰| 富顺县| 通河县| 富顺县| 玉门市|