Swift 中的 Int 到 UInt(反之亦然)位转换 [英] Int to UInt (and vice versa) bit casting in Swift

查看:14
本文介绍了Swift 中的 Int 到 UInt(反之亦然)位转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在寻找一种将 Int 的位值位转换为 UInt 的直接方法,反之亦然.例如(为简单起见,使用 8 位整数)我想实现以下目标:

I am looking for a direct way to bit cast the bit values of an Int to UInt and vice versa. For example (using the 8 bits integers for simplicity) I want to achieve the following:

let unsigned: UInt8 = toUInt8(-1)  // unsigned is 255 or 0xff
let signed:   Int8  = toInt8(0xff) // signed is -1 

起初我提出了以下解决方案:

At first I came out with the following solution:

let unsigned = unsafeBitCast(Int8(-1), UInt8.self)
let signed   = unsafeBitCast(UInt8(0xff), Int8.self)

但苹果在unsafeBitCast()"文档中声明如下:

But Apple in the "unsafeBitCast()" documentation states the following:

.. 注意:: 破坏了 Swift 类型系统的保证;与极度关心.几乎总是有更好的方法来做任何事情.

.. Caution:: Breaks the guarantees of Swift's type system; use with extreme care. There's almost always a better way to do anything.

谁有更好的方法?

推荐答案

你可以这样做:

let unsigned = UInt8(bitPattern: Int8(-1)) // -> 255
let signed   = Int8(bitPattern: UInt8(0xff)) // -> -1

存在许多类似的初始化器:

Many similar initializers exist:

extension Int8 {
    init(_ v: UInt8)
    init(_ v: UInt16)
    init(truncatingBitPattern: UInt16)
    init(_ v: Int16)
    init(truncatingBitPattern: Int16)
    init(_ v: UInt32)
    init(truncatingBitPattern: UInt32)
    init(_ v: Int32)
    init(truncatingBitPattern: Int32)
    init(_ v: UInt64)
    init(truncatingBitPattern: UInt64)
    init(_ v: Int64)
    init(truncatingBitPattern: Int64)
    init(_ v: UInt)
    init(truncatingBitPattern: UInt)
    init(_ v: Int)
    init(truncatingBitPattern: Int)
    init(bitPattern: UInt8)
}

这篇关于Swift 中的 Int 到 UInt(反之亦然)位转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆