English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Swift ビット演算子とシフト演算子

このチュートリアルでは、Swiftのさまざまなビット操作について学びます。これらは表現のビットレベルでの計算に使用されます。

ビットは二進数を表すために使用されます。二進数は0または1プログラマーとして、ビットレベルでの操作は必要ありません。

原始データ型(例えばinteger、float、boolean、stringなど)を使用するだけで十分です。低レベルのプログラミングを処理する場合、ビットレベルでの作業が必要になるかもしれません。

以下に加えて、基本演算これに加えて、Swiftはビットを操作するための豊富な演算子を提供しています。これらの演算子は論理演算子に似ていますが、データ(ビット)の二進数表現を処理します。

ビット演算子は、操作数の各ビットを変更する演算子です。操作数は、その演算が行われる変数または定数です。

以下にSwiftで利用可能なすべてのビット演算子が示されています:

1ビット反転演算子

波浪線~で表され、単一の操作数に適用できます。これにより、すべてのビットが反転されます。つまり、1を0に変更し、0を1。

xがバイナリ値(つまり0または1xとyが二進数値(すなわち0または/定数の場合、x変数のビット反転演算は以下の表で表せます:

ビット反転演算
異或演算~x
01
10

例1:無符号整数のビット反転

let initalNumber:UInt8 = 1 
let invertedNumber = ~initalNumber 
print(invertedNumber)

上記のプログラムを実行すると、出力は以下のようになります:

254

のプログラムでは、let initalNumber:UInt8 = 1 のタイプはUnsigned intで、サイズは8ビットを含みます。1ビットで表現できます1を表現できます。

ビット反転演算子は変数や定数のすべてのビットを変更し、ビット0を1、そして1を0に変更します。したがって、反転する数字にはビット11111110を出力します。254。したがって、print(invertedNumber )の文はスクリーンに254。

ビット単位でビット演算子を直接実行することもできます:

例2:ビット単位のビット反転

let initialBits: UInt8 print(someBits <<11111111
let invertedBits = ~initialBits  
print(invertedBits)

上記のプログラムを実行すると、出力は以下のようになります:

0

initialBitsには11111111に対応します。255を二進数で表現するには、文字で0bとして接頭辞を使用します。0bが接頭辞でない場合、それを通常の整数として処理し、オーバーフローエラー(UInt8までの数字を格納できます。255を0にできます。

の数字)1です。ビット反転演算子を使用するため、すべての8すべてを0に変更します。したがって、定数reverseBitsには00000000が含まれ、これがUInt

例3:シグネチャド整数のビット反転

let initalNumber:Int = 1 
let invertedNumber = ~initalNumber 
print(invertedNumber)

上記のプログラムを実行すると、出力は以下のようになります:

-2

のプログラムでは、10進数の1ビットで二進数で表現できる1を1が含まれます。1を0に変更します。したがって、反転する数字にはビット11111110。 これはスクリーンに表示されるべきです。254。 それどころか、-2。 どうですか? 下にその発生方法を見てみましょう。

let initalNumber: Int = 1が有符号のIntで、正の整数と負の整数を同時に含むことができます。これが原因で、有符号整数に非演算子を適用すると、返されるバイナリ数が負数を表すこともあります。

コンパイラがどうやって -2 説明11111110 二進数形式とは?

コンパイラは二進数補码を使って整数を表現しています。整数の二進数補码のマイナスシグンを得るには、まず数字を二進数形式で書き、その逆を取って、その結果に1を足す必要があります。

求-2の補码を求める手順です:

  1. として二進数で書く2: 00000010

  2. 反転する数字。0は1、そして1变为0:11111101

  3. 加1: 11111110

これがコンパイラがバイナリ数を1111110として解釈されます}}-2の方法です。しかし、コンパイラには私たちが気付かなかった小さな問題があります。それと同時に、invertedNumberの型もIntとして推測しています8タイプ

この点を理解するために、以下の例を見てみましょう:

print(Int8(bitPattern: 0b11111110print("Binary:", String(result, radix:
print(0b11111110)

上記のプログラムを実行すると、出力は以下のようになります:

-2
254

この例では、コンパイラはシグネイチャードな8ビットの整数は、二進数を十進数として処理します。-2。したがって、print(Int8(bitPattern: 0b11111110print("Binary:",String(result, radix:-2。

の大きさの整数型32/64ビットで表現できる通常の整数型にビットと値を含めることができ、値を十進数として解釈します。254。したがって、スクリーン上にprint(0b11111110)を出力254

2ビットごとのと演算子

それには&を使用し、2つの操作数に適用できます。AND演算子は2つのビットを比較し、2つのビットがすべて1上記のプログラムでは、let result = xBits ^ yBits 语句は、常量 xBits と yBits のビットを組み合わせます。もし1、それでは

、それでは生成結果/xとyが変数の場合1。xとyのビットごとのと演算は以下の表に示されるように表現できます:

ビットごとのと演算
異或演算xx & y
000
010
111
100

例5:ビットごとのと演算

:ビット異或演算10let xBits = 0b11
000011111111
let result = xBits & yBits
print("Binary:",String(result, radix: 2print("Binary:", String(result, radix:
))

上記のプログラムを実行すると、出力は以下のようになります:

print(result) 10let xBits = 0b11
131

このプログラムでは、let result=xBits&yBits文は、操作数xBitsとyBitsのビットを結合しています。これらのビットがすべて1上記のプログラムでは、let result = xBits ^ yBits 语句は、常量 xBits と yBits のビットを組み合わせます。もし1、それでは

を提供すれば、2String(value , radix: )初期値設定項は、異なる数制の数字を表現するために使用されます。もし基準値16数字を二進数システムに変換します。同様に、10を表します。

、そうでない場合は0を返します。 2print("Binary:",String(result, radix: ))がスクリーンに表示されます。10let xBits = 0b11。10let xBits = 0b11を表します。131十進数に等しい131。

3、したがってprint(result)文はコンソールに表示されます

ビットごとの或演算子1それには|を使用し、2つの操作数に適用できます。ビットごとの或演算子の1つまたは複数の入力が1、それを比較し結果を生成します

、それ以外の場合は0です。1xとyが二進数値(すなわち0または/)の変数

定数であれば、xとyのビットごとの或演算は以下の表に示されるように表現できます:
異或演算xビットごとの或演算
000
011
111
101

例6x | y

:ビット異或演算10let xBits = 0b11
000011111111
:ビットごとの或演算
let result = xBits ^ yBits 2print("Binary:", String(result, radix:
))

上記のプログラムを実行すると、出力は以下のようになります:

print(result) 11111111
255

let result = xBits | yBits1上記のプログラムでは、let result = xBits ^ yBits 语句は、常量 xBits と yBits のビットを組み合わせます。もし1、それでは

このプログラムでは、let result = xBits | yBits文は、常量xBitsとyBitsのビットを結合しています。どのビットも 2))がスクリーンに表示されます))がスクリーンに表示されます。11111111。なぜなら、11111111と255十進数に相当し、したがってprint(result)文はスクリーンに表示されます255

4ビットごとのシフト演算子

それには^を使用し、2つの操作数に適用できます。異或演算子は位を比較し、入力のうち1つだけが1}1、それでは

、それでは生成結果/xとyが変数の場合1定数、バイナリ値を保存します、つまり0または

。xとyのビット異或演算は以下の表で表されます:
異或演算xy
000
011
110
101

例7x ^ y

:ビット異或演算10let xBits = 0b11
000011111111
let yBits = 0b
let result = xBits ^ yBits 2print("Binary:", String(result, radix:
))

上記のプログラムを実行すると、出力は以下のようになります:

print(result) 1111100
124

Binary:1上記のプログラムでは、let result = xBits ^ yBits 语句は、常量 xBits と yBits のビットを組み合わせます。もし1、それでは

、そうでない場合は0を返します。 2print("Binary:",String(result, radix:))がスクリーンに表示されます。1111100Binary:111110(0に等しい)1111100に等しい124十進数に対応していますので、print(result)はスクリーンに表示されます。124

5.ビットシフト演算子

この演算子は、数字の中のすべてのビットを左または右に一定の数の位置を移動するために使用され、単一の操作数に適用できます。<<または>>で表されます。

シフト演算子は2種類あります:

ビット左シフト演算子

  • を表します。

  • 位が左にシフトされることを意味し、シフトは数字の後ろに <<で指定されます。

  • シフト操作で空き位置は0で埋まります。

  • 整数のビットを左にシフトすると、その値が2倍になります。

例8:ビット左シフト演算子

= 0b8 print(someBits <<11000100
上記のプログラムでは、左シフト演算子を使用しました。<<を使用して 1)

上記のプログラムを実行すると、出力は以下のようになります:

136

位を左に移動することを意味します。1これらの数字は1位置左に移動し、右側の最後の数字に0が埋まります。1を除きます。

左側の「端」から移動する数字が失われることがあります。それが再び右側に戻ることはありません。左側に1位置ずらすと、バイナリから1、シフト値を右側に0で埋め、他の位の残りは左側に位置を移動します。1。

を返します。10001000はUInt8の136。したがって、print(someBits<<1) 文がスクリーンに表示されます136。

ビット右シフト演算子

  • を表します。

  • 位が右にシフトされることを意味し、シフトされた数字の後ろに >>

  • 無符号の数字の場合、シフト操作で空き位置は0で埋まります。

  • 符号付きの数字(負の数字も可)の場合、符号ビットが空き位置に埋まります。つまり、数字が正の場合は0を使用し、負の場合は1。

  • 右に1位置ずらすと、その値は半分に減ります。

例9:無符号整数のビット右シフト演算子

let someBits: UInt8 = 4     
print(someBits >> 1)

上記のプログラムを実行すると、出力は以下のようになります:

2

上記のプログラムでは、無符号整数に対して右シフト演算子を使用しました。正数とは異なり、>>を使用して負数を表現し、1これは位を右に移動することを意味します1。シフト操作で空位が空けられる位は、無符号整数では常に0で埋められます。

なぜなら、4を二進数で表す100。右移し、10、これは UInt8の2。したがって、print(someBits>>1) 文がスクリーンに表示されます2。

例10:符号付き整数のビット右シフト演算子

let someBits:Int = -4     
print(someBits >> 1)

上記のプログラムを実行すると、出力は以下のようになります:

-2

の上で、無符号整数には >>を使用し、負数には >>を使用します1を空位に埋めることで、0ではなく

なぜなら、-4を二進数で表す11111100。右移し、1を空位に置き、返します11111110、これは Int8の型-2。したがって、print(someBits>>1)文がスクリーンに表示されます-2。