假设您正在使用位集或类似的东西,本质上是一些允许您访问各个位的值的对象。它可能是一个简单的东西,比如一个整数字或一个字节数组,或者像Java中的BitSet那样更通用的东西,具体取决于你想要处理的位数。
我的问题涉及将有用位的长度转换为以字节数表示的长度。这几乎总是需要的,因为您通常不能分配少于8位(1字节)的内存,因此您最终会在“位设置”对象中添加额外的填充位。
那么,总结一下,你如何正确地获得以比特为单位来容纳给定大小所需的字节大小?
注意:考虑可能导致错误答案的潜在整数溢出。例如,如果n_bytes = (n_bits + 7) / 8
足够大,n_bits
可能会导致整数溢出。
答案 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)