天天看点

微软官方算法技巧

作者:opendotnet

一个直接操控内存的算法,微软官方代码。

先上图:

微软官方算法技巧

假如说要把一个数据data的二进制从右往左共count位写入到一个长度为64bit位的内存里,但是内存剩余的bit位m_FreeBitsInCurrentSlot不足以容纳count长度大小,那么应该怎么做呢?

首先,先从data里面取出内存剩余的bit位长度,写入内存。再计算出data里面剩余的没有写入内存的bit位长度,实例化一个新的内存空间(因为上面的64bit位内存空间已经用完)。把计算出来的data剩余的bit位长度,写入到新的内存空间。

老规矩,先上代码,注释在代码里面:

这段代码的意思是把8字节也就是64bit的data的二进制从右第一位开始往左,数count位,存入到内存的某个位置。              data是需要被操作的数,count是需要操作的bit位数              void BitStreamWriter::Write( size_t data, UINT32 count )              {              _ASSERT(count <= BITS_PER_SIZE_T); //判断操作的bit位数,确保小于64。因为64位系统的8字节,最大的bit位数也就是64位。                  if(count) //如果操作的bit位数不等于0              {              // Increment it now as we change count later on              m_BitCount += count; //m_BitCount统计总共操作了多少bit位,每次进入count就持续相加。                  if( count > m_FreeBitsInCurrentSlot ) //m_FreeBitsInCurrentSlot被初始化成了64,代表八个字节的位数.每次进入一个count,都会在在m_FreeBitsInCurrentSlot的基础上减去count。这里如果count需要操作的bit位数,大于了m_FreeBitsInCurrentSlot剩余的位数。也就是说count操作的bit位数,大于8个字节剩余能放下的bit位数。那么继续如下判断              {              if( m_FreeBitsInCurrentSlot > 0 ) //8字节剩余的bit位数大于0              {              _ASSERTE(m_FreeBitsInCurrentSlot < BITS_PER_SIZE_T); //确保8字节剩余的bit位数,小于64,也就是小于8个字节              WriteInCurrentSlot( data, m_FreeBitsInCurrentSlot ); //这里WriteInCurrentSlot函数的第二参数本来是count,但是这里是m_FreeBitsInCurrentSlot,是因为上面判断了8字节剩余的bit位数不能容纳下count操作数的bit位数,所以这里只是把能容纳下的,也就是剩余的bit位数m_FreeBitsInCurrentSlot放入到内存。              count -= m_FreeBitsInCurrentSlot; //因为总共要放入count个操作数的bit位,在内存中已经放入了m_FreeBitsInCurrentSlot个bit位,那么剩余还没放入的bit位就是count=count-m_FreeBitsInCurrentSlot。以便下面的操作放入              data >>= m_FreeBitsInCurrentSlot;//因为data的二进制从右向左第一位开始总共放入了m_FreeBitsInCurrentSlot个bit位数,这里向右移动m_FreeBitsInCurrentSlot位,表示已经放入的抛弃掉,剩余没有放入的bit位,则放在data里面,继续下面放入。              }                  _ASSERTE( count > 0 );//这里确保剩余的没有放入的count位不为0                  // Initialize the next slot              if( ++m_pCurrentSlot >= m_OutOfBlockSlot )//因为上面的8字节64位已经放满了,所以这里从新初始化一个8字节64位的长度内存地址。在里面放数据。              {              // Get a new memory block              AllocMemoryBlock();//这里重新初始化一个m_pCurrentSlot内存地址,参数count对参数data操作的结果放入的内存就是它m_pCurrentSlot              }                  InitCurrentSlot();//这里实例化一个新的8字节64位的字节。也就是把m_FreeBitsInCurrentSlot赋值为64              // Write the remainder              WriteInCurrentSlot( data, count ); //这个地方把剩余的上面没有放置进入的,这里放入进去,count是上面所得剩余。              m_FreeBitsInCurrentSlot -= count;//这里的m_FreeBitsInCurrentSlot初始化的值是64,它减去放入了的count位,计算剩余的位,以便下次操作继续放入。              }              else //如果count操作数,小于剩余的位数m_FreeBitsInCurrentSlot,这里直接放入,不需要上面的步骤              {              WriteInCurrentSlot( data, count ); //这里同上,放入data二进制从右往左第一位开始共count位数据到内存,也就是m_pCurrentSlot里面去。              m_FreeBitsInCurrentSlot -= count; //这里同样,放入了count个位,就要在m_FreeBitsInCurrentSlot里面减去count个位,以便知道剩余位是多少。              // if m_FreeBitsInCurrentSlot becomes 0 a nwe slot will initialized on the next request              }              }              }           

以上是整个的内存操作,截取bit位,实例化内存地址,结合if和else判断,不得不佩服设计的精巧度。

继续阅读