C中按位与&的妙用

一、提取关心的某几位,去掉不关心的

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),只取出来低位,所以规律一样。

 

 

            

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值