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