(byte) ((val & 0xff00) >>> 8);
这是Java代码。我想将此代码转换为Swift。但是没有>>>操作员在swift。如何在Swift中使用Zero fill right shift?
答案 0 :(得分: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
答案 1 :(得分:1)
Swift中的运算符>>
为零填充(对于无符号整数):
无符号整数的位移行为如下:
- 现有位按所请求的位数向左或向右移动。
- 任何超出整数存储范围的位都将被丢弃。
- 在原始位向左或向右移动后,将零空格插入。
醇>
答案 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
当消极时,基本上摆脱了符号位。