您的位置  > 互联网

2017年上海事业单位考试:Swift按位和移位运算

因此,十进制1可以表示为二进制``。 按位 NOT 运算符更改变量或常量的所有位,位 0 更改为 1,位 1 更改为 0。因此“包含位”。 转换为十进制后,表示为254。因此,语句`print()`将254打印到屏幕上。 您还可以直接在位中执行按位运算符,如下所示: * * *### 示例 2:位中的按位 NOT 运算符 ``` : UInt8 = = ~ print() ``` 当您运行此程序时,输出为:````````包含与十进制255对应的二进制值``。 为了用二进制表示数字,我们在文字前面加上“0b”前缀。 如果没有 0b 作为前缀,它将把它当作普通整数,并会发生溢出错误(UInt8 只能存储 0 到 255 之间的数字)。 由于我们使用了按位 NOT 运算符,因此所有 1 都变为 0。 因此,常量包含 ,它等于 UInt8 中的 0 。

* * *### 示例 3:有符号整数的按位 NOT 运算符 ``` :Int = 1 let = ~ print() ```运行此程序时,输出为: ```swift-2`` `在上面的程序中,十进制的1可以表示为二进制的``。 按位 NOT 运算符更改变量或常量的所有位,位 0 更改为 1,位 1 更改为 0。因此,“包含位”。 这应该在屏幕上输出 254。 相反,返回 -2。 奇怪吧? 下面我们来探讨一下这是如何发生的。 `let :Int = 1` 是一个有符号整数,可以容纳正整数和负整数。 这就是为什么当我们不对有符号整数应用运算符时,返回的二进制也可能表示负数。 **编译器如何将-2解释为二进制形式的``? **编译器使用[二进制补码] (% "Two's ") 来表示整数。 要获得整数的补码负号,您应该首先将数字以二进制形式写出,然后将数字反转,然后将结果加一。

**求 -2 的补码的步骤**: 1. 将 2 写成二进制形式:`` 2. 将数字反转。 0 变成 1,1 变成 0:``3。 添加 1:``这就是编译器将二进制数解释为十进制数 `-2` 的方式。 然而,编译器中有一个我们没有注意到的细微变化。 它还将 ` 的类型推断为 `Int8` 类型。 * * *为了理解这一点,让我们看下面的例子: ```(Int8(: ))print()``` 运行这个程序时,输出是: ```swift-2254```在上面的示例中,对于有符号 8 位整数,编译器仅将二进制数处理为十进制 -2。 因此,语句 `print(Int8(: ))` 在屏幕上打印 -2。 但对于大小为 32/64 位并且可以容纳更大值的普通整数类型,它将其解释为“254”。 因此,语句 `print()` 在屏幕上打印 **254**。 * * *## 2. 按位AND 运算符 用`&` 表示,可以应用于两个操作数。

AND 运算符比较两个位,如果两个位都为 1,则返回 1,否则返回 0。如果 `x` 和 `y` 是变量/常量并保存二进制值(即 0 或 1),则按位 AND 运算`x` 和 `y` 如下表所示: AND | `x` | `y` | `x 和 y` || --- | --- | --- || 0 | 0 | 0 || 0 | 1 | 0 || 1 | 1 | 1 || 1 | 0 | 0 |* * *### 示例 5:按位与运算``` xBits = yBits == xBits & (":",(, radix: 2))print()```运行此程序时,输出为:`` `: ```在上面的程序中,语句`let = xBits & yBits`组合了两个操作数`xBits`和`yBits`的位。 如果两个位都为 1,则返回 1,否则返回 0。 `(value, radix:)` 初始化器用于表示不同计数系统中的数字。

如果提供了基数 2。 它将数字转换为二进制数字系统。 同样,您可以使用 16 表示十六进制,使用 10 表示十进制。 语句 `print(":",(, radix: 2))` 在屏幕上打印 `:`。 “print()”语句在控制台中输出 131,十进制等于 131。 * * *## 3. 按位或运算符 它表示为“|”,可以应用于两个操作数。 如果按位或运算符的一个或多个输入为 1,则比较这两个位,结果为 1; 否则为0。如果`x`和`y`是变量/常量并且保存二进制值,即0或1。则`x`和`y`的按位或运算如下表所示: `x` | `y` | x| y || --- | --- | --- || 0 | 0 | 0 || 0 | 1 | 1 || 1 | 1 | 1 || 1 | 0 | 1 |* * *### 示例 6:按位或运算``` xBits = yBits == xBits | (":" , (, radix: 2))print() ```运行该程序时,输出为: ```: ```在上面的程序中,语句`let = xBits | yBits` 组合了两个常量“xBits”和“yBits”位。

如果任意位为 1,则返回 1,否则返回 0。语句 `print(":",(, radix: 2))` 在屏幕上打印 `:`。 由于 `` 等于十进制的 `255`,因此语句 `print()` 在屏幕上打印 **255**。 * * *## 4. 按位异或运算符 表示为“^”,可应用于两个操作数。 如果 XOR 运算符的输入之一恰好为 1,则 XOR 运算符比较这两个位并产生结果 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:按位异或运算```` xBits = yBits == xBits ^ (":", (, radix: 2))print() ```运行此程序时,输出是: ```:``在上面的程序中,语句`let = xBits ^ yBits`组合了两个常量`xBits`和`yBits`的位。

如果恰好有一位为 1,则返回 1,否则返回 0。语句 `print(":",(, radix: 2))` 在屏幕上输出 `:`(相当于)。 由于 `` 等于十进制的 `124`,因此语句 `print()` 在屏幕上打印 **124**。 * * *## 5.按位移位运算符 该运算符用于将数字中的所有位向左或向右移动一定数量的位置,并且可以应用于单个操作数。 表示为``. 移位运算符有两种类型: * * *### 按位左移运算符 * 表示为“1”,表示将位向右移动 1。移位操作腾出的位总是用零填充对于无符号整数。 由于 4 以二进制形式表示为 ``. 向右移动一位,返回 ``,相当于 UInt8 中的 2。 因此,“print( >> 1)”语句在屏幕上打印 2。 * * *#### 示例 10:有符号整数的按位右移运算符 ``` :Int = -( >> 1) ``` 当运行此程序时,输出为: ```swift-2` ` `在上面的程序中,我们对无符号整数使用了右移运算符。 与正数不同,负数使用“>>”,用 1 而不是 0 填充空格。 由于“-4”在二进制中表示为“”。 将其右移一位并将 1 放入空闲位置将返回 ``,相当于 `Int8` 类型的 `-2`。 因此,`print( >> 1)`语句在屏幕上打印-2。