2016-10-07 8 views
0
(byte) ((val & 0xff00) >>> 8); 

これはJavaコードです。私はこのコードをSwiftに変換したい。しかし、>>>演算子は即座にはありません。 SwiftでZero fill right shiftを使用するにはどうすればよいですか?スワイプでのゼロフィル右シフト

+0

私はSwiftの経験はありませんが、[docs](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html)をすばやく見てからSwiftには、ファーストクラスのunsigned intがあり、ゼロフィルシフトが適用されます。 –

答えて

2

あなたがバイトを抽出するために、整数型 のtruncatingBitPattern初期化子を使用する場合は、値をマスクする必要はありませんし、シフト演算がゼロでいっぱいかどうかは問題ではありません。 (ソース のタイプが符号なしか署名済みかによって異なります)。

バイトは符号付きまたは符号なし 数として解釈されるべきであるかどうかに に応じInt8またはUInt8を選択します。

let value = 0xABCD 

let signedByte = Int8(truncatingBitPattern: value >> 8) 
print(signedByte) // -85 

let unsignedByte = UInt8(truncatingBitPattern: value >> 8) 
print(unsignedByte) // 171 
0

バイトが8ビットのみであるため、この場合ゼロ記入シフトintは必要ありません。

あなたが持っているコードは、スウィフトで

(byte) (((val & 0xFF00) >> 8) & 0xFF) 

または

(byte) ((val & 0xFF00) >> 8) 

または

(byte) (val >> 8) 
+1

Swiftにコードを書き直すことについての質問... –

+0

@MarkoTopolnik真実ですが、コードが単純なら実際の変換を行うことができると私は推測しました。誰かがSwiftのためにこれに答えるなら、私は削除します。 –

+0

このコードで間違った値が表示されています。例:結果は= -123でなければなりませんが、このコードでは133を値として取得しています。 – BadCode

1

オペレータ>>と同じである(符号なし整数のための)ゼロ・フィルです:

次のように符号なし整数のビットシフト動作は次のとおり

  1. 既存のビットは、場所の要求数によって左右に移動されます。
  2. 整数の記憶域の境界を超えて移動したビットは破棄されます。
  3. 元のビットが左または右に移動した後に残されたスペースにゼロが挿入されます。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html#//apple_ref/doc/uid/TP40014097-CH27-ID29

0

残念ながら、ゼロフィル右シフト演算子は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 

ネガティブ記号の場合は基本的に符号ビットを取り除きます。

関連する問題