清除位时唯一的最大一组不同字节值
Largest set of different byte values unique when clearing bits
我正在创建一种数据格式,它将存储在 DS2431 单线 EEPROM 中。一页将使用 EPROM 仿真模式(其中一旦写入的数据只能通过清除位进行修改)。在此页面中,我想存储一个带有 ID 的字节,该 ID 不能更改为另一个有效值(因为只允许清除位)。
我正在考虑使用 popcount 为 4 的一组值(有 70 个不同的值)。清除任何位意味着 popcount 不再是 4,因此这满足所需的 属性.
但是能否找到一组具有 70 多个不同值且满足 属性 的字节值?
没有。对于 8 位值,使用四位是最佳选择。
如果您有 70 个 4 位值并决定添加一个 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\tvalues\n") ;
for( int p = 0; p < 9; p++ )
{
printf( " %d\t\t %d\n", 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。
我正在创建一种数据格式,它将存储在 DS2431 单线 EEPROM 中。一页将使用 EPROM 仿真模式(其中一旦写入的数据只能通过清除位进行修改)。在此页面中,我想存储一个带有 ID 的字节,该 ID 不能更改为另一个有效值(因为只允许清除位)。
我正在考虑使用 popcount 为 4 的一组值(有 70 个不同的值)。清除任何位意味着 popcount 不再是 4,因此这满足所需的 属性.
但是能否找到一组具有 70 多个不同值且满足 属性 的字节值?
没有。对于 8 位值,使用四位是最佳选择。
如果您有 70 个 4 位值并决定添加一个 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\tvalues\n") ;
for( int p = 0; p < 9; p++ )
{
printf( " %d\t\t %d\n", 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。