【问题标题】:Swift Array[UInt8] using Bitwise operator not work?使用按位运算符的 Swift Array[UInt8] 不起作用?
【发布时间】:2016-05-16 07:28:35
【问题描述】:

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

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

print(test[0]) -> 5

print(5<<8) -> 1280

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

原来是上面的错误

谁能解释一下?

【问题讨论】:

    标签: arrays swift bitwise-operators


    【解决方案1】:

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

    它适用于print(5&lt;&lt;8) -&gt; 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 用于整数类型,即使您的值已知为非负数 - 除非您特别需要使用固定大小的类型。

    【讨论】:

    • @HungCLo 乐于助人:)
    【解决方案2】:

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

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

    5 &lt;&lt; 8 起作用的原因是因为5 是一个Int,其大小通常为 32 或 64 位。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多