Algorithm 关于比特计数器的澄清

Algorithm 关于比特计数器的澄清,algorithm,data-structures,Algorithm,Data Structures,这是指针对以下帖子的评论: '每个计数器可以使用4位,而不是2个字节。如果对计数器进行分组,甚至可以降低该值,例如,如果对3个计数器进行分组,即10*10*10=1000个组合,则需要10位(=1024个值) 由于我不是计算机科学背景,请帮助我解释一下1/2字节跟踪计数器背后的技术。这个想法是,您可以利用这样一个事实,即您拥有的比特数超过了表示存储的单个值所需的比特数。当你使用一种本质上支持位操作的编程语言时,这是最实用的,比如C++ +< /P> 对于给定的整数,它需要log2(num)位来

这是指针对以下帖子的评论:

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

由于我不是计算机科学背景,请帮助我解释一下1/2字节跟踪计数器背后的技术。

这个想法是,您可以利用这样一个事实,即您拥有的比特数超过了表示存储的单个值所需的比特数。当你使用一种本质上支持位操作的编程语言时,这是最实用的,比如C++ +< /P> 对于给定的整数,它需要
log2(num)
位来表示中的值。作为推论,您可以使用
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
收回 使用逻辑仅提取所需值的位。按位AND逻辑给出一个值,该值的二进制表示形式包含1,其中两个操作数都有1

检索下部零件

val = compositeVal & PIECE_MASK_LOWER
compositeVal = compositeVal | val
检索上部零件

val = compositeVal & PIECE_MASK_LOWER
compositeVal = compositeVal | val
这与获取较低的部件相同;但首先需要确保目标值的位位于按位AND操作的正确位置

val = (compositeVal >> VALUE_SIZE) & PIECE_MASK_LOWER
compositeVal = compositeVal | (val << VALUE_SIZE)
储存 使用逻辑将要存储的值的位应用于存储它的字节。按位OR逻辑给出一个结果,其二进制表示形式包含1,其中任一操作数都有1

存储下部零件

val = compositeVal & PIECE_MASK_LOWER
compositeVal = compositeVal | val
存储上部部件

val = compositeVal & PIECE_MASK_LOWER
compositeVal = compositeVal | val
这与存储较低的部分相同,只是您需要将它们放置在按位OR操作的位置

val = (compositeVal >> VALUE_SIZE) & PIECE_MASK_LOWER
compositeVal = compositeVal | (val << VALUE_SIZE)

compositeVal=compositeVal |(val
如果每个整数最多出现十次,那么我们可以用四位半字节计算它的出现次数。
数字10(十)可以用四位编码,因此是半字节。但是10只需要
log2(10)~=3.32
要表示的位,因此您可以将多个计数器组合在一起以节省更多空间(如引号中所示)。完美的解释-谢谢