gpt4 book ai didi

具有可变位数的 Swift 符号扩展

转载 作者:搜寻专家 更新时间:2023-11-01 07:03:36 25 4
gpt4 key购买 nike

我需要将 8 位值符号扩展为 12 位。在 C 中,我可以这样做。我阅读了 Apple 的 BinaryInteger 协议(protocol)文档,但它没有解释扩展到可变位数的符号(而且我在 Swift 方面也很陌生)。假设 val 是 UInt8 并且 numbits 是 12,我如何在 Swift 中执行此操作?

#define MASKBITS(numbits) ((1 << numbits) - 1)

#define SIGNEXTEND_TO_16(val, numbits) \
( \
(int16_t)((val & MASKBITS(numbits)) | ( \
(val & (1 << (numbits-1))) ? ~MASKBITS(numbits) : 0) \
))

最佳答案

您可以使用 Int8(bitPattern:) 来转换给定的无符号数值到具有相同二进制表示的有符号值,然后通过转换为 Int16 进行签名扩展,再次进行无符号签名,最后截断到给定的位数:

func signExtend(val: UInt8, numBits: Int) -> UInt16 {
// Sign extend to unsigned 16-bit:
var extended = UInt16(bitPattern: Int16(Int8(bitPattern: val)))
// Truncate to given number of bits:
if numBits < 16 {
extended = extended & ((1 << numBits) - 1)
}
return extended
}

例子:

for i in 1...16 {
let x = signExtend(val: 200, numBits: i)
print(String(format: "%2d %04X", i, x))
}

输出:

 1 0000 2 0000 3 0000 4 0008 5 0008 6 0008 7 0048 8 00C8 9 01C810 03C811 07C812 0FC813 1FC814 3FC815 7FC816 FFC8

关于具有可变位数的 Swift 符号扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49595095/

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