一、提取关心的某几位,去掉不关心的
1、0x95=1001 0101,想看下第二三位是不是01;(最低位是第0位,最高位第7位)
2、If(0x95 & 0x0c == 0x04)
1001 0101
& 0000 1100
= 0000 0100(0x04)
任何数与1与等于他本身,与0与等于0(0清0,1不动)
二、控制循环buffer读写地址
1、首先buf 大小必须是2^n,
如何判断输入设置的buf大小是不是2^n? if(bufSize & bufSize - 1 == 0 )
eg: bufSize 为8(2^3), bufSize -1为7
bufSize 8 1000
& bufSize -1 7 0111
= 0000
就是用了2^n最高位为1其他位为0,-1最高位变为0,其他位为1,相与得0;
即使长度为1(2^0)(1&0=0)都满足
2、循环读写入,
我们写循环buf的思路就是判断写的位置是不是超过了buf边界,过了就重头写,
一般会用一个Pos指向要写的位置,然后一直改Pos
leftSpaceLen =min(needWriteLen ,bufSize - Pos ) //needWriteLen 需要写入多少数据
memcpy( buf + Pos , srcBuf , leftSpaceLen )
If(leftSpaceLen < needWriteLen ){
memcpy( buf , srcBuf + leftSpaceLen , needWriteLen - leftSpaceLen )
Pos= needWriteLen - leftSpaceLen
}else{
Pos +=needWriteLen;
}
这边需要用if来判断是否越界,然后重新定回来Pos。
如果使用&来操作:
写
Pos=((bufSize -1) & haveWritreCount) //haveWritreCount已经写过了多少数据
leftSpaceLen =min(needWriteLen ,bufSize - Pos ) //needWriteLen 需要写入多少数据
memcpy( buf + Pos , srcBuf , leftSpaceLen )
memcpy( buf , srcBuf + leftSpaceLen , needWriteLen - leftSpaceLen )
haveWritreCount+= needWriteLen
这里haveWritreCount是定义为unsigned int型的,一直再+needWriteLen ,直到超过上限,又变回0,不用我们判断,
更骚的操作就是判断写的位置
Pos=((bufSize -1) & haveWritreCount)
eg :
bufSize=8 ,我们已经写了(haveWritreCount)5个数据,这次需要写入(needWriteLen )4个,
bufsize - 1 7 111
&haveWritreCount 5 101
Pos = 101=5
然后leftSpaceLen =min(4 , 8 -5 ) =3;
先memcpy( buf + 5 , srcBuf ,3),在后面放3个
后memcpy( buf , srcBuf +3 , 4-3)在前面放1个,
之后haveWritreCount +=4变为9,
下次再写4个,这时
我们已经写了(haveWritreCount)9个数据,这次需要写入(needWriteLen )4个,
bufsize - 1 7 0111
&haveWritreCount 9 1001
Pos = 0001=1 !!!//多骚,回到了1的位置
然后leftSpaceLen = min( 4 , 8-1)=4;
先memcpy( buf + 1 , srcBuf ,4),在前面放4个
后memcpy( buf , srcBuf +4 , 4-4)在前面放0个,
之后haveWritreCount +=4变为13,
-------------------------------------------------------------------------------------------------------------------------------------------
原因:主要就是bufSize-1 最高位为0,其他位变为1,
1)haveWritreCount < bufsize 时,最高位都为0,其他位在变化//(这里最高位指haveWritreCount 中对应的bufsize最高的那一位)
2)haveWritreCount >=bufsize 时,最高位以及更高位会变为1,其他位从0变为1,直到低位全为1,向最高位进位,然后变为0,但是& (bufsize-1),只取出来低位,所以规律一样。