零填充右移快速

时间:2016-10-07 08:41:04

标签: ios swift

(byte) ((val & 0xff00) >>> 8);

这是Java代码。我想将此代码转换为Swift。但是没有>>>操作员在swift。如何在Swift中使用Zero fill right shift?

4 个答案:

答案 0 :(得分:2)

如果使用整数类型的truncatingBitPattern初始值设定项 要提取一个字节,那么你不必屏蔽该值,如果移位运算符填充零或一个(这取决于是否为源)无关紧要 类型是无符号或签名的。)

选择Int8UInt8取决于 关于字节是否应该被解释为有符号或 无符号数。

let value = 0xABCD

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

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

答案 1 :(得分:1)

Swift中的运算符>>为零填充(对于无符号整数):

  

无符号整数的位移行为如下:

     
      
  1. 现有位按所请求的位数向左或向右移动。
  2.   
  3. 任何超出整数存储范围的位都将被丢弃。
  4.   
  5. 在原始位向左或向右移动后,将零空格插入。
  6.   

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

答案 2 :(得分:0)

在这种情况下,您不需要零填充移位,因为一个字节只有8位。

您拥有的代码与

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

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

(byte) (val >> 8)

答案 3 :(得分: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

当消极时,基本上摆脱了符号位。