gpt4 book ai didi

swift - 如何在 Swift 中使用位操作?

转载 作者:搜寻专家 更新时间:2023-10-31 08:04:50 24 4
gpt4 key购买 nike

我需要形成一个 20 字节的数据包,并通过蓝牙将有效载荷发送到硬件外围设备。

这个20字节的数据包内部分为14组数据,每组11位,最后6位为空字符。

因此,总计:160 位(20 字节)= 14(集合)* 11(位)+ 6(空字符)

11 位又分为 2 位、3 位和 6 位各 3 组。然而,这对主要问题并不重要,我目前能够通过采用“Int16”来形成 11 位。我会做移位操作来过滤这11位,我知道。

如果我只有一个数据集,那么我应该用空字符填充除前 11 位之外的所有 20 个字节,如果是两个数据集,那么除了 22 位之外的所有字节都应该分别为空字符和。

我面临的问题是形成这个连续的 160 位,因为奇数位是 11。我想过使用“Int”并进行移位(<<)操作,然后按位或(|)但是Int 是 64 位。

目前我认为采用 20 个固定大小的字符数组适合这种情况。虽然在概念上我认为这是最好的方法,但在编程上我无法形成具有实现这一目标的所有条件的逻辑。我想我需要将所有逻辑放在一个循环中。

谁能告诉我这是实现此目标的正确方法,并指导我解决它,如果这是最好的方法。或者指出任何其他可用的方式。

最佳答案

直到最后才需要将所有数据集打包到 20 字节的数组中,因此将它们保存在长度为 14 的 Int 数组中。使用这种方式更容易。当您需要将其发送到硬件时,将其转换为长度为 20 的 UInt8 数组:

struct DataPacket {
var dataSets = [Int](count: 14, repeatedValue: 0)

func toCArray() -> [UInt8] {
var result = [UInt8](count: 20, repeatedValue: 0)
var index = 0
var bitsRemaining = 8
var offset = 0

for value in self.dataSets {
offset = 10

while offset >= 0 {
let mask = 1 << offset
let bit = ((value & mask) >> offset) << (bitsRemaining - 1)
result[index] |= UInt8(bit)

offset -= 1
bitsRemaining -= 1
if bitsRemaining == 0 {
index += 1
bitsRemaining = 8
}
}
}

return result
}
}

// Usage:
var packet = DataPacket()
packet.dataSets[0] = 0b11111111111
packet.dataSets[1] = 0b00000000011
// etc...

let arr = packet.toCArray()

有很多转移操作正在进行,所以我无法解释所有这些操作。总体理想是将这些 11 位数据集中的每一个分配为字节,并根据需要溢出到下一个字节。

关于swift - 如何在 Swift 中使用位操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35685242/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com