关于位计数器的澄清

时间:2015-02-25 03:09:24

标签: algorithm data-structures

这是指对帖子的评论 - Sorting 10 million integers with 1 MB space Solution explanation - Programming Pearls

'每个计数器可以使用4位,而不是2个字节。如果您对计数器进行分组,您甚至可以降低此值,例如,如果您对3个计数器进行分组,那么10 * 10 * 10 = 1000个组合,并且您需要10位(= 1024个值)。'

由于我不是来自计算机科学背景,所以非常感谢帮助解释跟踪计数器背后的技术,只需1/2个字节。

1 个答案:

答案 0 :(得分:0)

我们的想法是,您使用bit manipulation来利用这样一个事实,即您拥有的位数比表示您存储的各个值所需的位数多。当您使用本质上支持位操作的编程语言时,这是最实用的,例如C ++。

对于给定的整数,它需要log2(num)位来表示binary中的值。作为推论,您可以使用2^n-1确定可以存储在给定位数中的最大整数,其中n是位数。因此,如果我们将自己限制为4位,那么我们可以表示的最大数字是15。

为简单起见,我们假设每个值中可用的位数为8(1个字节)。根据您的要求,我们将为每个存储值使用4位。此外,后面的代码将使用C ++。

助手常数

这些常量将有助于计算。

 const int PIECE_MASK_LOWER = 15  //All 4 lower bits set to 1
 //NOTE: 15 = 2^0 + 2^1 + 2^2 + 2^3
 const int VALUE_SIZE = 4 //We're using 4 bits for each value

检索

使用bitwise AND逻辑仅提取所需值的位。按位AND逻辑给出一个值,其二进制表示包含1,其中两个的操作数都有1。

检索下方

val = compositeVal & PIECE_MASK_LOWER

检索上方

这与获得较低的一块相同;但是首先需要right-shift the bits,以便目标值的位在按位AND运算的正确位置。

val = (compositeVal >> VALUE_SIZE) & PIECE_MASK_LOWER

贮藏

使用bitwise OR逻辑将要存储的值的位应用于要存储它的字节。按位OR逻辑给出一个结果,其二进制表示包含1,其中 的操作数为1。

存储较低的部分

compositeVal = compositeVal | val

存储上层

这与存储下部部分相同,除非您需要left-shift the bits,以便它们处于按位OR运算的位置。

compositeVal = compositeVal | (val << VALUE_SIZE)

注意:如果要覆盖复合值中的一个部分,则必须清除已存在的值。否则,按位OR运算将为您提供损坏的值。