Ch18. 位元運算子與運算子函式.

Slides:



Advertisements
Similar presentations
猜谜语 有个小娃娃,真是没 礼貌。 见到小树摇一摇,吓 得树叶哇哇叫。 见到小花逗一逗,摘 去她的太阳帽。 没人和它交朋友,只 好自已到外处跑。
Advertisements

第一單元 建立java 程式.
黄帝内经 内经教研室 王黎.
Introduction to C Programming
职官与科举 职官:在国家机构中担任一定职务的官吏,这里面有职官的名称、职权范围和品级地位等方面的内容。
花开有日 芬芳天下 “国培计划(2012)” ——幼儿园骨干教师远程培训项目 山东幼儿园教师8班第4期简报 主办人:张瑞美     
《卖火柴的小女孩》 《海的女儿》 你 认 识 这 些 图 片 的 故 事 吗 《丑小鸭》 《拇指姑娘》 它们都来自于哪位作家笔下?
數位邏輯設計與實習 Ch02基本邏輯閘與布林代數.
民主國家的政府體制 我國的中央政府體制 我國中央政府的功能 地方政府組織與功能
銷售與顧客關係管理 巫立宇.邱志聖 著.
20、豆花庄的小家伙们.
CH11 心理疾病 李志鴻.
华 夏 之 祖 第 3 课.
法學緒論第六單元:法律適用 設計課程︰ 財經法律系 --楊東連 法學緒論-6.
CH1 . 集 合 与 命 题.
Ch19 創業精神 管理學:整合觀點與創新思維3/e.中山大學企管系 著.前程文化 出版.
陳維魁 博士 儒林圖書公司 第九章 資料抽象化 陳維魁 博士 儒林圖書公司.
以考试说明带动二轮复习 福州第三中学 张璐.
資料結構使用Java 第1章 資料結構與Java程式複習.
跨越海峡的生命桥.
正反器 一、循序邏輯電路 二、動作情形:用時序(timing),其次輸出( )是由外界輸入與( )所共同決定。
Visual C++ introduction
簡易C++除錯技巧 長庚大學機械系
2-3 基本數位邏輯處理※.
列舉(enum).
第四章 流程控制(一) if,if-else 與 switch
保留字與識別字.
使用VHDL設計—4位元位移器 通訊一甲 B 楊穎穆.
Java程式概觀.
C語言簡介 日期 : 2018/12/2.
Class(二) Overloaded Operators User-Defined Conversions 前言 超載運算子
Methods 靜宜大學資工系 蔡奇偉副教授 ©2011.
第1章 單晶片微電腦概論.
第 4 章 運算式 (Expression).
JAVA程式語言入門(I) 授課教師:王大瑾
第一章 直角坐標系 1-1 數系的發展.
資料結構 第4章 堆疊.
程式設計 博碩文化出版發行.
第一單元 建立java 程式.
能盡物之性,則可以贊天地之化育。 可以贊天地之化育,則可以與天地矣。 《中庸﹒第二十一章》
分支宣告與程式設計 黃聰明 國立臺灣師範大學數學系
Ch17.泛型.
JAVA 程式設計 資訊管理系 - 網路組.
5 重複迴圈 5.1 增減運算符號 增量運算符號 減量運算符號
第六章 簡介運算子超載 (Operator Overloading)
使用VHDL設計 七段顯示器 通訊工程系 一年甲班 姓名 : 蘇建宇 學號 : B
CH1 我的第一個App與變數宣告.
CH10. 屬性與方法.
CH05. 選擇敘述.
Ch15. 型態轉換與延展.
小數除法.
LINQ資料查詢技術.
Class & Object 靜宜大學資工系 蔡奇偉副教授 ©2011.
Foundations of Computer Science Chapter 4 資料運算
Ch09. 類別、結構與列舉.
Mathematica 動畫教學 -振動模態
函數應用(二)與自定函數.
Ch07. 函式.
1-1 二元一次式運算.
使用VHDL設計-8x3編碼電路 通訊一甲 B 楊穎穆.
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
第十二章 離散小波轉換之相關浮水印技術.
查表法&電腦IO Port二進制轉七段顯示器
計算機程式設計 老師:謝孟諺 助教:楊斯竣.
第五章 運算關係式(Expression).
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
方法(Method) 函數.
ABAP Basic Concept (2) 運算子 控制式與迴圈 Subroutines Event Block
Presentation transcript:

Ch18. 位元運算子與運算子函式

18.1 位元運算子 Swift的位元運算子(bitwise operator)計有&(且)、|(或)、^(互斥 或)、~(反)、<<(左移),及>>(右移)。 位元運算子比關係運算子來得低,而比邏輯運算子來得高,但 ~、<<、>>是例外。 位元運算子的結合性也是由左至右。 其中 & 運算子,表示兩個位元皆為1時,結果才為1,否則為0。

位元運算子 & 的真值表 位元1 位元2 位元1 & 位元2 1

位元運算子 | 的真值表 位元1 位元2 位元1 | 位元2 1

位元運算子 ^ 的真值表 位元1 位元2 位元1 ^ 位元2 1 位元運算子 ~ 的真值表 位元 ~ 位元 1

18.1.1 用來判斷與設定位元的狀態 位元 & 與 | 運算子常用來處理遮罩(mask)的問題。 18.1.1 用來判斷與設定位元的狀態 位元 & 與 | 運算子常用來處理遮罩(mask)的問題。 常用來判斷哪些位元是1,而 | 常用來將某些位元設為1。

範例程式 var aValue: UInt8 = 17 var result: UInt8 let mask1: UInt8 = 0x0f // 判斷最右邊的4位元哪一個位元是1 result = aValue & mask1 print("\(aValue) & 00001111 = \(result)") // 判斷最左邊的4位元哪一個位元是1 result = aValue & mask2 print("\(aValue) & 11110000 = \(result)") // 設定最右邊的4位元為1 result = aValue | mask1 print("\(aValue) | 00001111 = \(result)") // 設定最左邊的4位元為1 result = aValue | mask2 print("\(aValue) | 11110000 = \(result)")

輸出結果 17 & 00001111 = 1 17 & 11110000 = 16 17 | 00001111 = 31 17 | 11110000 = 241

Swift運算子的運算優先順序與結合性 運算子 結合性 ! ~ 由右至左 * / % 由左至右 + - << >> ! ~ 由右至左 * / % 由左至右 + - << >> < < = > >= == != & ^ | && || = += -= *= /= %=

18.1.2 用來當做乘、除的功能 我們來敘述位元左移運算子的功能,它好比將某數乘以2n。而位 元右移運算子的功能,則好比是將某數除以2n。

範例程式 let p: UInt16 = 64 var result: UInt16 result = p << 2 print("\(p) << 2 = \(result)") result = p >> 2 print("\(p) >> 2 = \(result)")

輸出結果 64 << 2 = 256 64 >> 2 = 16

18.1.3 用來將兩數對調 一般我們在處理兩數對調時,需要藉助一暫時的變數。 但若以位元運算子 ^,則不需要有暫時的變數。

範例程式 var myScore = 100, yourScore = 80 print("對調前:myScore = \(myScore), yourScore = \(yourScore)") // 兩數對調動作 myScore = myScore ^ yourScore yourScore = yourScore ^ myScore myScore = myScore ^ yourScore print("對調後:myScore = \(myScore), yourScore = \(yourScore)")

輸出結果 對調前:myScore = 100, yourScore = 80 對調後:myScore = 80, yourScore = 100

18.2 運算子函式 類別和結構提供一些所謂多載運算子 (overloading operator) 來實 作已存在的運算子。 18.2 運算子函式 類別和結構提供一些所謂多載運算子 (overloading operator) 來實 作已存在的運算子。 對於客製化的結構問題則須藉助運算子函式 (operator function)。

18.2.1 多載運算子 + 以下是針對複數 (complex number) 的相加撰寫其相關的運算子函 式。 18.2.1 多載運算子 + 以下是針對複數 (complex number) 的相加撰寫其相關的運算子函 式。 複數包括實數 (real) 與虛數 (imaginary)兩部份。

範例程式 // operator function struct Complex { var a = 0 var b = 0 } func + (complex1: Complex, complex2: Complex) -> Complex { return Complex(a: complex1.a + complex2.a, b: complex1.b + complex2.b) let oneObject = Complex(a: 5, b: 3) let anotherObject = Complex(a: 2, b: 2) let sumComplex = oneObject + anotherObject print("\(sumComplex.a) + \(sumComplex.b)i" )

輸出結果 7 + 5i

18.2.2 prefix與 postfix運算子 來看有關 prefix與 postfix運算子,這些運算子與單元運算子有關, 可能是正、負號運算子或是前置與後繼運算子。

範例程式 // prefix struct Complex { var a = 0 var b = 0 } prefix func - (complexObject: Complex) -> Complex { return Complex(a: complexObject.a , b: -complexObject.b) let oneObject = Complex(a: 5, b: 3) let negativeObject = -oneObject print("\(negativeObject.a)\(negativeObject.b)i" )

輸出結果 5-3i

18.2.3 複合指定運算子 複合指定運算子 (compound assignment operator) 結合等號運算子 (=) 與其它運算子,如算術指定運算子(+=) 即結合算術運算子與等 號運算子,使得加法和指定以一單行的型式表示。 這一類的實作在運算子左邊的變數參數需加上inout。

範例程式 struct Complex { var a = 0 var b = 0 } func + (complex1: Complex, complex2: Complex) -> Complex { return Complex(a: complex1.a + complex2.a, b: complex1.b + complex2.b) func += (complex1: inout Complex, complex2: Complex) { complex1 = complex1 + complex2 var oneObject = Complex(a: 5, b: 3) let anotherObject = Complex(a: 2, b: 2) oneObject += anotherObject print("\(oneObject.a)+\(oneObject.b)i" )

輸出結果 7+5i

18.2.4 客製化運算子 可以使用 operator關鍵字並宣告 prefix 、infix 或postfix來自訂運算 子函式。 18.2.4 客製化運算子 可以使用 operator關鍵字並宣告 prefix 、infix 或postfix來自訂運算 子函式。 例如客製化 +++ 運算子函式,將某一 complex 的實數與虛數分別 自已相加,亦即將實數和虛數乘以 2。

範例程式 // customize operator struct Complex { var a = 0 var b = 0 } func + (complex1: Complex, complex2: Complex) -> Complex { return Complex(a: complex1.a + complex2.a, b: complex1.b + complex2.b) func += (complex1: inout Complex, complex2: Complex) { complex1 = complex1 + complex2 prefix operator +++ prefix func +++ (complex: inout Complex) -> Complex { complex += complex return complex var obj3 = Complex(a: 5, b: 3) let obj4 = +++obj3 print("\(obj3.a)+\(obj3.b)i" ) print("\(obj4.a)+\(obj4.b)i" )

輸出結果 10+6i