<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # Swift 按位和移位運算符 > 原文: [https://www.programiz.com/swift-programming/bitwise-operators](https://www.programiz.com/swift-programming/bitwise-operators) #### 在本教程中,您將學習 Swift 中的不同按位運算。 這些用于表達式中的位級別計算。 位用于表示二進制數字。 二進制數可以有兩個可能的值 0 或 1。作為初學者級程序員,您不必在位級別進行操作。 使用原始數據類型,例如:整數,浮點數,布爾值,字符串等就足夠了。 在處理[低級編程](https://en.wikipedia.org/wiki/Low-level_programming_language "Low level programming")時,可能需要在位級工作。 除了[基本運算符](/swift-programming/operators "Swift operators")之外,Swift 還提供了豐富的運算符集來操作位。 這些運算符與邏輯運算符相似,不同之處在于它們使用數據(位)的二進制表示形式工作。 按位運算符是用于更改操作數的各個位的運算符。 操作數是完成操作的變量或常量。 迅速列出所有可用的按位運算符: * * * ## 1.按位非運算符 它由代字號`~`表示,可以應用于單個操作數。 這會將所有位反轉。 即將 1 更改為 0,將 0 更改為 1。 如果`x`是保存二進制值(即 0 或 1)的變量/常數,則`x`變量的按位非運算可以表示在下表中: | `x` | `~x` | | --- | --- | | 0 | 1 | | 1 | 0 | * * * ### 示例 1:無符號整數的按位非運算符 ```swift let initalNumber:UInt8 = 1 let invertedNumber = ~initalNumber print(invertedNumber) ``` 當您運行上述程序時,輸出將是: ```swift 254 ``` 在上面的程序中,語句`let initalNumber:UInt8 = 1`的類型為`Unsigned int`,大小為 8 位。 因此,十進制的 1 可以表示為二進制的`00000001`。 按位非運算符更改變量或常量的所有位,位 0 更改為 1,而 1 更改為 0。因此`invertedNumber`包含位`11111110`。 將其轉換為十進制后,將其表示為 254。因此,語句`print(invertedNumber)`在屏幕中輸出 254。 您還可以直接在位中執行按位運算符,如下所示: * * * ### 示例 2:以位為單位的按位非運算符 ```swift let initialBits: UInt8 = 0b11111111 let invertedBits = ~initialBits print(invertedBits) ``` 運行該程序時,輸出為: ```swift 0 ``` `initialBits`包含對應于十進制 255 的二進制值`11111111`。 為了用二進制表示數字,我們在字面值中以`0b`作為前綴。 如果沒有`0b`作為前綴,它將把它當作普通整數對待,并且會出現溢出錯誤(`UInt8`只能存儲 0 到 255 之間的數字)。 由于我們使用了按位非運算符,因此將所有 1 都更改為 0。因此,常量`initialBits`包含`00000000`,它等于`UInt8`中的 0。 * * * ### 示例 3:帶符號整數的按位非運算符 ```swift let initalNumber:Int = 1 let invertedNumber = ~initalNumber print(invertedNumber) ``` 運行該程序時,輸出為: ```swift -2 ``` 在上面的程序中,十進制的 1 可以表示為`00000001`的二進制。 按位非運算符更改變量或常量的所有位,位 0 更改為 1,1 更改為 0。因此,`invertedNumber`包含位`11111110`。 這應該在屏幕中輸出 254。 而是返回-2。 奇怪吧? 讓我們在下面探討這是如何發生的。 `let initalNumber:Int = 1`是一個可以容納正整數和負整數的有符號整數。 這就是為什么當我們不對有符號整數應用運算符時,返回的二進制也可能表示負數的原因。 **編譯器如何將 -2 解釋為二進制形式的`11111110`?** 編譯器使用[二進制補碼](https://en.wikipedia.org/wiki/Two%27s_complement "Two's complement")表示整數。 要獲得整數的二進制補碼負號,您應該首先以二進制形式寫出數字,然后反轉數字,然后在結果中加一個。 **找出 -2** 的二進制補碼的步驟: 1. 以二進制形式寫 2:`00000010` 2. 反轉數字。 0 變成 1,而 1 變成 0:`11111101` 3. 加 1:`11111110` 這就是編譯器將二進制數`1111110`解釋為十進制`-2`的方式。 但是,編譯器有些許變化,我們沒有注意到。 它還將`invertedNumber`的類型推斷為`Int8`類型。 * * * 為了理解這一點,讓我們看下面的例子: ```swift print(Int8(bitPattern: 0b11111110)) print(0b11111110) ``` 運行該程序時,輸出為: ```swift -2 254 ``` 在上面的示例中,編譯器僅對帶符號的 8 位整數將二進制數處理為十進制的-2。 因此,語句`print(Int8(bitPattern: 0b11111110))`在屏幕上輸出 -2。 但是對于大小為 32/64 位并且可以容納較大值的普通整數類型,它將其解釋為`254`。 因此,語句`print(0b11111110)`在屏幕上輸出 **254**。 * * * ## 2.按位與運算符 它由`&`表示,可以應用于兩個操作數。 與運算符比較兩個位,如果兩個位均為 1,則返回 1,否則返回 0。 如果`x`和`y`是變量/常數,且保持二進制值(即 0 或 1),則`x`和`y`的按位與運算如下表所示: 與 | `x` | `y` | `x & y` | | --- | --- | --- | | 0 | 0 | 0 | | 0 | 1 | 0 | | 1 | 1 | 1 | | 1 | 0 | 0 | * * * ### 例 5:按位與運算 ```swift let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits & yBits print("Binary:",String(result, radix: 2)) print(result) ``` 運行該程序時,輸出為: ```swift Binary: 10000011 131 ``` 在上面的程序中,語句`let result = xBits & yBits`組合了兩個操作數`xBits`和`yBits`的位。 如果兩個位均為 1,則返回 1,否則返回 0。 `String(value , radix: )`初始化器用于表示不同編號系統中的編號。 如果提供基數 2。它將數字轉換為二進制數系統。 同樣,十六進制可以使用 16,十進制可以使用 10。 語句`print("Binary:",String(result, radix: 2))`在屏幕上輸出`Binary: 10000011`。`10000011`等于十進制的 131,語句`print(result)`在控制臺中輸出 131。 * * * ## 3.按位或運算符 它表示為`|`,可以應用于兩個操作數。 如果按位或運算符的一個或多個輸入為 1,則將兩個位進行比較,并生成結果 1;否則為 0。 如果`x`和`y`是變量/常數,且保持二進制值,即 0 或 1。則`x`和`y`的按位或運算如下表所示: 或 | `x` | `y` | <code>x &#124; y</code> | | --- | --- | --- | | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 1 | 1 | | 1 | 0 | 1 | * * * ### 例 6:按位或運算 ```swift let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits | yBits print("Binary:", String(result, radix: 2)) print(result) ``` 運行該程序時,輸出為: ```swift Binary: 11111111 255 ``` 在上述程序中,語句`let result = xBits | yBits`組合了兩個常量`xBits`和`yBits`的位。 如果任何位為 1,則返回 1,否則返回 0。 語句`print("Binary:",String(result, radix: 2))`在屏幕上輸出`Binary: 11111111`。 由于`11111111`等于十進制的`255`,因此語句`print(result)`在屏幕上輸出 **255** 。 * * * ## 4.按位異或運算符 它表示為`^`,可以應用于兩個操作數。 如果異或運算符的輸入之一恰好是 1,則異或運算符將比較兩個位并生成結果 1,否則返回 0。 如果`x`和`y`是變量/常數,且保持二進制值,即 0 或 1。則`x`和`y`的按位異或運算如下表所示: 異或 | `x` | `y` | `x ^ y` | | --- | --- | --- | | 0 | 0 | 0 | | 0 | 1 | 1 | | 1 | 1 | 0 | | 1 | 0 | 1 | * * * ### 示例 7:按位異或操作 ```swift let xBits = 0b10000011 let yBits = 0b11111111 let result = xBits ^ yBits print("Binary:", String(result, radix: 2)) print(result) ``` 運行該程序時,輸出為: ```swift Binary: 1111100 124 ``` 在上述程序中,語句`let result = xBits ^ yBits`組合了兩個常量`xBits`和`yBits`的位。 如果正好一位為 1,則返回 1,否則返回 0。 語句`print("Binary:",String(result, radix: 2))`在屏幕上輸出`Binary:1111100`(相當于 01111100)。 由于`1111100`等于十進制的`124`,因此語句`print(result)`在屏幕上輸出 **124**。 * * * ## 5.按位移位運算符 該運算符用于將數字中的所有位向左或向右移動一定數量的位置,并且可以應用于單個操作數。 它表示為`<<`或`>>`。 移位運算符有兩種: * * * ### 按位左移運算符 * 表示為`<<` * 這會導致這些位向左移動,由`<<`后面的數字指定。 * 移位操作已騰空的位置用零填充。 * 將整數左移一位將其值加倍 * * * #### 例 8:按位左移運算符 ```swift let someBits:UInt8 = 0b11000100 print(someBits << 1) ``` 運行該程序時,輸出為: ```swift 136 ``` 在上面的程序中,我們使用了左移運算符。 使用`<<` 1 表示將位向左移動 1。 這些數字向左移動一個位置,右側的最后一個數字填充零。 您還可以看到丟失的數字**從左側“移出”**。 它不會從右側再次纏繞。 將其向左移動一位將二進制文件中的 1 刪除,向右添加 0 以填充移位后的值,其余的其他位則向左移動 1。 這將返回`10001000`,它等效于`UInt8`中的`136`。 因此,`print(someBits << 1)`語句在屏幕上輸出 **136**。 * * * ### 按位右移運算符 * 表示為`>>` * 這會導致這些位向右移動數字,后跟`>>` * 對于無符號數字,移位操作已騰空的位位置為零。 * 對于帶符號的數字(也可以為負的數字),符號位用于填充騰出的位位置。 換句話說,如果數字為正數,則使用 0;如果數字為負數,則使用 1。 * 向右移動一個位置可將其值減半。 * * * #### 示例 9:無符號整數的按位右移運算符 ```swift let someBits: UInt8 = 4 print(someBits >> 1) ``` 運行該程序時,輸出為: ```swift 2 ``` 在上面的程序中,我們對無符號整數使用了右移運算符。 使用`>> 1`表示將位右移 1。 移位操作已騰空的位位置始終在無符號整數上填充零。 由于 4 以二進制形式表示為`00000100`。 向右移動一位,返回`00000010`,它等效于`UInt8`中的`2`。 因此,`print(someBits >> 1)`語句在屏幕上輸出 2。 * * * #### 示例 10:有符號整數的按位右移運算符 ```swift let someBits:Int = -4 print(someBits >> 1) ``` 運行該程序時,輸出為: ```swift -2 ``` 在上面的程序中,我們對無符號整數使用了右移運算符。 與正數不同,對負數使用`>>`,使用 1 填充空位,而不是 0。 由于`-4`用二進制表示為`11111100`。 將其向右移動一位并將 1 放置在空閑位置,將返回`11111110`,與`Int8`類型的`-2`等效。 因此,`print(someBits >> 1)`語句在屏幕上輸出 -2。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看