如何在Swift中使用位操作?

拉梅斯瓦尔·普拉萨德|

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

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

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

11位又分为3组,分别为2位,3位和6位。但是,对于主要问题并不重要,我目前可以通过采用“ Int16”构成11位。我知道对11位进行移位操作。

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

我面临的问题是由于11的奇数位而形成了这个连续的160位。我想到了一个'Int'并执行shift(<<)操作,然后进行按位OR(|),但一个Int为64位。

目前,我认为采用20个固定大小的字符数组将适合这种情况。尽管从概念上讲,我认为这是最好的方法,但从编程上讲,我无法在满足所有条件的情况下形成逻辑。我认为我需要将所有逻辑都放在一个循环中。

任何人都可以告诉您这是实现此目标的正确方法,并指导我解决问题的方法(如果这是最好的方法)。或指出其他可用方式。

代码不同

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

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位数据集分配为字节,然后根据需要溢出到下一个字节。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Swift中使用结构处理按位运算?

来自分类Dev

如何在Swift中使用位字段来存储1位以上的值

来自分类Dev

如何在Java中使用位操作获取数字的绝对值

来自分类Dev

如何在Java中使用位掩码

来自分类Dev

如何在C ++中使用位掩码?

来自分类Dev

如何在C中使用位操作在不使用+运算符的情况下相加两个数字

来自分类Dev

如何在django中使用crud操作?

来自分类Dev

如何在 redux 中使用异步操作

来自分类Dev

如何在 vhdl 中使用“+”操作?

来自分类Dev

SWIFT:如何在Swift中使用SubscriberCellularProviderDidUpdateNotifier

来自分类Dev

如何在Cython中使用128位整数

来自分类Dev

如何在C中使用64位内联汇编?

来自分类Dev

如何在地图中使用位集?

来自分类Dev

如何在Android中使用256位AES加密

来自分类Dev

如何在邮件签名中使用位智导航链接

来自分类Dev

如何在 QueryDSL 中使用按位运算符?

来自分类Dev

如何在Swift Playground中使用Realm?

来自分类Dev

如何在Swift中使用MarqueeLabel?

来自分类Dev

如何在Swift中使用map函数?

来自分类Dev

如何在Swift中使用dequeueReusableCellWithIdentifier?

来自分类Dev

如何在Swift中使用Block?

来自分类Dev

如何在Swift中使用CFArrayRef?

来自分类常见问题

如何在终端中使用swift?

来自分类Dev

如何在Swift中使用CMAltitudeHandler?

来自分类Dev

如何在Swift中使用NSEventMask

来自分类Dev

如何在终端中使用Swift

来自分类Dev

如何在Swift中使用objectAtIndex

来自分类Dev

如何在Swift中使用MKPolylineView

来自分类Dev

如何在Realm Swift中使用NOT IN