Bitter 5.0.0

Bitter 5.0.0

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最新发布2019年12月
SPM支持SPM

Umberto Raimondi维护。



Bitter 5.0.0

Bitter

Swift 4 compatible License: MIT Travis CI

摘要

Bitter库扩展了所有基本的Swift Int类型,包含一些有用的位操作方法。库的目的是通过使用合理缩写的命令来简化处理位和位运算的代码,从而使代码更简洁、更易读。使用Bitter后,您可以这样替换您原有的代码

var i:UInt32 = 0xAABBCCDD
let tmp = (i & (0xFF << 16)) >> 16 // Let's swap the 2nd and 3rd byte...
i = (i & ~(0xFF << 16)) | ((i & (0xFF << 8)) << 8)
i = (i & ~(0xFF << 8)) | (tmp << 8)
i = (i & ~((0x1 << 3) << 8)) | (i & ((0x1 << 3) << 8)) // Set the 4th bit of the 2nd byte

为以下代码

let tmp = i[2] // Let's swap the 2nd and 3rd byte!
i[2] = i[1]
i[1] = tmp 
i[1] = i[1].setb3(1) // Set the 4th bit of the 2nd byte
i[1] = i[1].setb3(0).setb4(1).setb5(0).setb6(1) // Let's set some other bit

安装

如果您想手动安装Bitter,只需将项目中的Sources/Bitter中的所有Swift文件包含到您的项目中,或将其作为git子模块加载。

Bitter也支持所有主要的依赖管理器:CocoaPods、Carthage和SwiftPM。

如果要在项目中使用CocoaPods中的Bitter,请在您的PodFile中添加它

use_frameworks!

pod 'Bitter'

然后使用pod install更新您的workspace。

Bitter也通过Carthage提供。要安装它,只需在Cartfile中写入以下内容

github "uraimo/Bitter"

使用carthage update下载框架并将其添加到您的嵌入式二进制文件中。

如果您正在使用Swift Package Manager,只需将Bitter添加到您的Package.swift依赖项中

// swift-tools-version:4.0
import PackageDescription

let package = Package(
    ...
    dependencies: [
        .package(url: "https://github.com/uraimo/Bitter.git", from: "4.0.0")
    ]
)

无论您如何将Bitter添加到项目中,都可以使用import Bitter导入它。

使用方法

让我们看看Bitter能提供什么

整型类型转换

每次你需要将包含位模式的整型转换成更小的整型时,都需要执行一个截断位转换,因为如果整型的内容大于接收类型允许的范围(例如,尝试 Int8(1000)),转换在运行时将直接失败。让我再次强调,我们执行的是位截断,而不是十进制截断转换。

可以使用构造函数 init(truncatingIfNeeded:) 来轻松执行位模式截断转换,但如果你需要经常这样做,你的代码将很快变得难以阅读。

使用 Bitter,每个 Intn/UIntn 类型都增加了一些方法,允许执行对较小整型类型的截断位模式转换,或者对较大和相同大小/不同符号整型的位模式转换: .to8, toU8, to16, toU16, to32, toU32, to64, toU64。toUn 方法执行无符号整型的转换,其中数字表示类型的大小,例如 .toU16 将将当前整型转换为 UInt16,如果需要则截断位模式。

让我们看看一个例子

var i:Int32 = 50000
var u8:UInt8 = i.toU8   //81, Without Bitter: var u8:UInt8 = UInt8(truncatingIfNeeded:i)

Bitter在混合类型表达式中也很有用,可以使代码更加简洁

class Test{
    var content:UInt32=0

    func shiftAndResizeMe(howMuch:Int)->UInt16{
        return  (content << howMuch.toU32).toU16  //Without Bitter: return UInt16(truncatingIfNeeded:(content << UInt32(truncatingIfNeeded:howMuch)))
    }
}

特定的字节下标

虽然从多字节数组中检索和修改单个字节很容易,但总是需要编写相同的代码可能有点令人烦恼,而 Bitter 为每个整型类型添加了下标来引用单个字节。遵循与 Int 转换相同的安全性原则,如果尝试修改当前类型之外的位,则会在运行时引发错误。

让我们看看一些示例

var i:UInt32 = 0xAABBCCDD

//Let's swap the two bytes
let tmp = i[2]           //Without Bitter: let tmp = (i & (0xFF << 16)) >> 16
i[2] = i[1]              //                i = (i & ~(0xFF << 16)) | ((i & (0xFF << 8)) << 8)
i[1] = tmp               //                i = (i & ~(0xFF << 8)) | (tmp << 8)

// Let's set to 0 the second bit of the second byte
i[1] &= 0b11111101       //Without Bitter: i = i & (0b11111101 << 8)

// Let's change the third byte
i[3] = 0xAA   //Error! There is no 3rd byte!

对于小端多字节数组,下标从最低有效位到最高有效位开始,如果有对整型应用了大端转换,则方向正好相反。

修改特定的位

所有整型类型(有符号或无符号)都增加了 8 个属性和 8 个函数,允许设置或获取整数的第一个字节中的单个位。它们与字节下标协同使用

var i:UInt32 = 0xAABBCCDD
i[2].b2 //0
i[2].b3 //1

i[2] = i[2].setb2(1).setb3(0)
i[2].b2 //1
i[2].b3 //0

.bN 属性返回指定位置的位数值,而 .setbN(value) 函数可以将整数(索引指的是8个最低有效位)中的特定位设置为值,并返回修改后的8位整数(如果用在超过8位的整数上,其余部分将被截断)。

考虑到每个 .setbN(value) 函数都会返回一个新的整数,因此可以将这些函数连接起来以修改多个位。这个函数可以与上面的字节索引下标一起使用,在右侧构建一个新字节值,并将其分配给数组的第2位。

其他功能

Bitter 还为 Int 类型添加了一些其他扩展。

  • 双否定运算符 ~~:这个新运算符在 C 或类似语言中与 !! 的功能相同,将所有不为 0 的整数值转换为 1,并将值 0 保持不变。当您想将表达式的结果转换为标准 C 0/1 整数布尔值以在其他表达式中使用时非常有用。

  • Int 类型的静态属性 size:它是 MemoryLayout<IntN>.stride 的简写。

  • mask(bits:msb:) 静态方法:它创建一个具有请求数量的位设置为 1 的掩码,起始位是从最高有效位开始或否。例如,调用 Int16.mask(5,msb:true) 将返回二进制中的 0xF800,即 1111100000000000,而调用 Int16.mask(5,msb:false) 将返回十六进制的 0x001F,因为五个位将从最低有效位开始设置为 1。

位操作

要了解更多关于 Swift 中的位操作的信息,请参阅我的博客上的文章 "在 Swift 中处理位集"(已更新到 Swift 4.0)。

贡献

首先,感谢您考虑为此项目做出贡献,所有 PR 都欢迎!

请注意,此库的源代码不是直接用 Swift 编写的,而是使用 Sourcery 生成的。

Bitter 的主模板位于 Templates/Bitter.stencil,而 compile.sh 脚本将负责下载 Sourcery 并将模板编译为 Swift 源代码。

3.x 之前的版本使用 GYB 模板编译器。