【发布时间】:2017-10-09 12:37:59
【问题描述】:
我有一个 8 字节的 QByteArray,我需要检查该数组中的特定位,但不是每次都检查相同的位。它可以是构成该 8 字节数组的 64 位中的任何一个。性能优先!
我当前的方法首先从该数组中获取一个特定字节,然后获取一个特定的半字节(或半字节),然后使用QByteArray::number(x, 2) 转换为具有二进制表示的另一个QByteArray,最后我检查该位.这很糟糕,我想要一个更好的方法。
我选择将其加载到 QBitArray 中,这样我就可以快速轻松地检索特定位。我假设它在内存中的表示与QByteArray 或quint64 相同,因此可以接受转换,但不允许转换。
如何快速检查QByteArray 中的特定位(0 到 63)是 1 还是 0?
【问题讨论】:
-
请将您当前的代码添加到问题中。我想知道为什么您不使用按位运算符来知道位的值。 stackoverflow.com/a/523737/2266412
-
因为它接受
int我正在寻找原始的QByteArray位检查。我首先必须找到该位所在的特定字节,转换为 int,然后使用该方法。字节位置和位位置需要逻辑才能确定。性能是一个问题,所以我想要更直接和更快的东西。我解释了我当前的代码,我根本不想使用它。它很乱,所以我认为发布它根本没有任何好处。 -
您所说的“逻辑”在现代 CPU 上是微不足道的。您真的应该前往godbolt.org 亲自看看。
-
unsigned long long bit=reinterpret_cast<unsigned long long*>array.constData() & (1<<bitToCheck);其中bitToCheck是从 0 开始的 -
@PaulBentley 如果您所做的所有三个假设都是正确的,那么这将起作用:字节顺序、位顺序和
unsigned long long的大小。你正确的机会大约是四分之一。
标签: c++ qt bit qbytearray