如何从位大小正确获取字节大小?

时间:2013-02-16 20:38:59

标签: byte bit integer-overflow

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

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

那么,总结一下,你如何正确地获得以比特为单位来容纳给定大小所需的字节大小?

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

2 个答案:

答案 0 :(得分: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

但是,编译器有时可能会自行进行这些优化,因此这可能不会那么好。

答案 1 :(得分:0)

使用long long int可以避免int溢出:

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