0

假设您使用的是位集或类似的东西,本质上是一些允许您访问各个位的值的对象。它可能是简单的东西,如整数字或字节数组,或者更通用的东西,如 Java 中的BitSet,具体取决于您要处理的位数。

我的问题涉及将有用位的长度转换为以字节数表示的长度。这实际上总是需要的,因为您通常不能分配少于 8 位(1 个字节)的内存,因此您最终会在“位集”对象中获得额外的填充位。

所以,总而言之,你如何正确地获得容纳给定比特大小所需的字节大小?

注意:考虑可能导致错误答案的潜在整数溢出。例如,如果足够大,n_bytes = (n_bits + 7) / 8可能会导致整数溢出。n_bits

4

2 回答 2

0

这是一个有效的答案,但是我认为有比这个更快的方法。

if ((bit_size % 8) == 0)
    byte_size = bit_size/8
else
    byte_size = bit_size/8 + 1



编辑:例如,为了加快速度,您可以用右移替换除法,用按位 AND 替换模数。

if ((bit_size & 7) == 0)
    byte_size = bit_size >> 3
else
    byte_size = (bit_size >> 3) + 1

但是,编译器有时可能会自己进行这些类型的优化,所以这可能并没有那么好。

于 2013-02-16T20:40:36.517 回答
0

您可以通过使用 long long int 来避免 int 溢出:

n_bytes = static_cast<int>((n_bits + 7LL) / 8)

于 2013-02-16T21:10:41.433 回答