尝试将我的应用程序从 C++ 转换为 Swift
C++:
static QWORD load64(const OCTET *x)
{
char i;
QWORD u=0;
for(i=7; i>=0; --i) {
u <<= 8;
u |= x[i];
}
return u;
}
swift :
func load64(x: UInt8) -> UInt64 {
var u: UInt64 = 0;
for var i=7; i>=0; --i {
u <<= 8;
u |= x[i];
}
return u;
}
但这行在 Swift 中不起作用:
u |= x[i];
而且我似乎找不到从整数中选择特定位的任何引用......有人知道如何吗?
最佳答案
在 Swift 中可以使用 |= 运算符,它的工作方式与在 C/C++ 中相同。
问题在于 C++ 代码中的 load64() 本质上将一个 OCTET 数组作为参数,并使用下标访问该数组。 Swift 版本将 UInt8 作为参数,并且您不能在 Swift 中为整数下标,就像在 C 或 C++ 中不能这样做一样。
据我所知,C++ 代码的重点是从作为参数传入的数组中提供的 8 字节数组构建一个 64 位 unsigned int。为了让它在 Swift 中工作,load64() 需要将一个字节数组作为参数,而不仅仅是一个字节。
顺便说一句,如果您想在 Swift 中使用 C++ 或 C 的大量代码库,则不必在 Swift 中重新编写它。您可以编写一个带有简化接口(interface)的 C/C++ 包装器并从 Swift 中调用它。我有一个关于如何在此处执行此操作的基本概念验证教程:http://www.swiftprogrammer.info/swift_call_cpp.html
顺便说一句,这是一个 Swift 版本的 load64(),对我有用:
func load64(x: [UInt8]) -> UInt64 {
var u: UInt64 = 0;
for var i=7; i>=0; --i {
u <<= 8;
u |= UInt64(x[i]);
}
return u;
}
关于c++ - 如何从 Swift 中的整数获取特定位?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32621240/