Swift Array [UInt8]使用Bitwise运算符不起作用?

时间:2016-05-16 07:28:35

标签: arrays swift bitwise-operators

我在操场上测试我的代码时感到困惑

var test: [UInt8] = [5, 6, 7, 8]

print(test[0]) -> 5

print(5<<8) -> 1280

print(test[0]<<8) -> error

错误结果如上所述

任何人都可以解释一下吗?

2 个答案:

答案 0 :(得分:3)

使用按位移位运算符时,必须按位移动小于要移位的值的类型大小。在这种情况下,您尝试将UInt8移位8位 - 超出该范围。

它为print(5<<8) -> 1280工作的原因是因为Swift推断这些类型是Int - 因此它应该是32位或64位,具体取决于平台。因为8小于此值,所以它会起作用。

如果您明确地将5强制转换为UInt8,则会出现编译器错误:

  

移位量大于或等于类型大小(位)

但是,似乎Swift无法为数组提供相同的编译器错误 - 只有运行时错误。

因此,解决方案是使用更大的类型。根据您使用此代码的内容,您可能需要使用UInt16数组。

var test: [UInt16] = [5, 6, 7, 8]

或者,如果你独立于数组使用移位值,你可以在转换之前将它们转换为更大的类型:

print(UInt16(test[0])<<8)

虽然您应该注意整数类型的Apple recommends you use Int,即使您的值已知为非负数 - 除非您特别需要使用固定大小的类型。

答案 1 :(得分:3)

您无法将UInt8移位8位或更多位。如果你检查控制台,你会发现Swift运行时正在告诉你。

fatal error: shift amount is larger than type size in bits

5 << 8有效的原因是因为5Int,通常是32或64位。

如果您想要更大的整数输出,请在执行转换之前转换值:

print(UInt32(test[0]) << 8)
//    ^^^^^^