清除位时,最大的一组不同字节值是唯一的
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了清除位时,最大的一组不同字节值是唯一的相关的知识,希望对你有一定的参考价值。
我正在创建一种数据格式,它将存储在DS2431单线EEPROM中。一页将使用EPROM仿真模式(其中一次写入的数据只能通过清除位来修改)。在这个页面中,我想存储一个带有ID的字节,该字节不能更改为另一个有效值(由于只允许清除位)。
我正在考虑使用popcount为4的值集合(有70个不同的值)。清除任何位意味着popcount不再是4,因此这满足了所需的属性。
但是可以找到一组具有70多个不同值的字节值,这些值满足属性吗?
答案
不是。对于8位值,使用4位是最佳的。
如果您有70个4位值并决定将5位值添加为有效值,则必须放弃5个可通过清除位来创建的4位值。同样,如果您想要一个有效的3位值,您还必须放弃五个4位值。
如果可以增加位数,则可以增加可能值与所用位的比率。
另一答案
由于只有256个可能的值和8个可能的种群,因此测试所有可能的种群数量是一项微不足道的任务:
#include <stdio.h>
#include <stdint.h>
int popcount( uint8_t byte )
{
int count = 0 ;
for( uint8_t b = 0x01; b != 0; b <<= 1 )
{
count = count + (((byte & b) != 0) ? 1 : 0) ;
}
return count ;
}
int main()
{
int valuecount[8] = {0} ;
for( int i = 0; i < 256; i++ )
{
valuecount[popcount(i)]++ ;
}
printf( "popcount values
") ;
for( int p = 0; p < 9; p++ )
{
printf( " %d %d
", p, valuecount[p] ) ;
}
return 0;
}
结果:
popcount values
0 1
1 8
2 28
3 56
4 70
5 56
6 28
7 8
8 1
任何字长n
的最佳人口数总是n / 2
。对于16位,具有8个1位的值的数量是12870。
以上是关于清除位时,最大的一组不同字节值是唯一的的主要内容,如果未能解决你的问题,请参考以下文章