清除位时,最大的一组不同字节值是唯一的

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。

以上是关于清除位时,最大的一组不同字节值是唯一的的主要内容,如果未能解决你的问题,请参考以下文章

ASA高级配置

区别:位字节字

需要示例代码片段帮助

字符c的ASCII码值是多少

文件的属性及基本操作

如何在android中清除字节缓冲区