(byte) ((val & 0xff00) >>> 8);
これはJavaコードです。私はこのコードをSwiftに変換したい。しかし、>>>演算子は即座にはありません。 SwiftでZero fill right shiftを使用するにはどうすればよいですか?スワイプでのゼロフィル右シフト
(byte) ((val & 0xff00) >>> 8);
これはJavaコードです。私はこのコードをSwiftに変換したい。しかし、>>>演算子は即座にはありません。 SwiftでZero fill right shiftを使用するにはどうすればよいですか?スワイプでのゼロフィル右シフト
あなたがバイトを抽出するために、整数型 のtruncatingBitPattern
初期化子を使用する場合は、値をマスクする必要はありませんし、シフト演算がゼロでいっぱいかどうかは問題ではありません。 (ソース のタイプが符号なしか署名済みかによって異なります)。
バイトは符号付きまたは符号なし 数として解釈されるべきであるかどうかに に応じInt8
またはUInt8
を選択します。
let value = 0xABCD
let signedByte = Int8(truncatingBitPattern: value >> 8)
print(signedByte) // -85
let unsignedByte = UInt8(truncatingBitPattern: value >> 8)
print(unsignedByte) // 171
バイトが8ビットのみであるため、この場合ゼロ記入シフトintは必要ありません。
あなたが持っているコードは、スウィフトで
(byte) (((val & 0xFF00) >> 8) & 0xFF)
または
(byte) ((val & 0xFF00) >> 8)
または
(byte) (val >> 8)
Swiftにコードを書き直すことについての質問... –
@MarkoTopolnik真実ですが、コードが単純なら実際の変換を行うことができると私は推測しました。誰かがSwiftのためにこれに答えるなら、私は削除します。 –
このコードで間違った値が表示されています。例:結果は= -123でなければなりませんが、このコードでは133を値として取得しています。 – BadCode
オペレータ>>
と同じである(符号なし整数のための)ゼロ・フィルです:
次のように符号なし整数のビットシフト動作は次のとおり
- 既存のビットは、場所の要求数によって左右に移動されます。
- 整数の記憶域の境界を超えて移動したビットは破棄されます。
- 元のビットが左または右に移動した後に残されたスペースにゼロが挿入されます。
残念ながら、ゼロフィル右シフト演算子はswift/objcに存在しません。別の方法として/回避策:
// java
// let's say we want to zero-fill right shift 4 bits
int num = -333;
num >>>= 4; // num: 268435435
// objc
NSInteger num = -333;
num >>= 1;
if (num < 0) num ^= NSIntegerMin;
num >>= 3; // num: 268435435
// swift (assume we are dealing with 32 bit integer)
var num: Int32 = -333
num >>= 1
if num < 0 {
num ^= Int32.min
}
num >>= 3 // num: 268435435
ネガティブ記号の場合は基本的に符号ビットを取り除きます。
私はSwiftの経験はありませんが、[docs](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html)をすばやく見てからSwiftには、ファーストクラスのunsigned intがあり、ゼロフィルシフトが適用されます。 –