C语言之位操作:清零,置1操作

简述:
A&=~(B<
A是被修改数
B是修改的位数
C是从第几位开始修改

		 可以这么读,
		 A从第C位开始,修改B位
>            A&=~(B<<C);
> 			 此公式,将A从第C位开始的B位数,清零
>  
>   			A|=(B<<C);
> 			 此公式,将A从第C位开始的B位数,置一

公式解析:
int A=0x5a;
A&=~(0x7<<1);
设定int为4字节

0x70000   0000   0000   0000   0000   0000   0000   0111

0x7<<1:	     0000   0000   0000   0000   0000   0000   0000   1110

~0x7<<1:     1111   1111   1111   1111   1111   1111   1111   0001   
		此时,将从我们要求开始以及修改的位数清为0,
		这样和我们的操作数相与肯定可以将要求的位给清零

**A&=~(0x7<<1)其实等价于A=A&(~(0x7<<1))**
A:            0000 0000 0000 0000  0000 0000 0101 1010
~0x7<<1:       1111 1111 1111 1111  1111 1111 1111 0001   
A&(~(0x7<<1))0000 0000 0000 0000  0000 0000 0101 0000

A:            0000 0000 0000 0000  0000 0000 0101 0000 
A:0x50

很明显,从1开始的三位被清零

我们再做置1操作
A|=(0x7<<1);等价于A=A|(0x7<<1)
0x70000 0000 0000 0000  0000 0000 0000 0111
0x7<<1:	 0000 0000 0000 0000  0000 0000 0000 1110
		此时,将从我们要求开始以及修改的位数置为1,
		这样和我们的操作数相或肯定可以将要求的位给置1
A:             0000 0000 0000 0000  0000 0000 0101 0000
A|(0x7<<1)0000 0000 0000 0000  0000 0000 0000 1110
结果为:         0000 0000 0000 0000  0000 0000 0101 1110
很明显,从1开始的三位被置1
A:0x5e

由上面两个公式,我们可以合并得出,被清零的地方,最好办,
全是0的地方,我们想设置为H,就可以用H和被清零的相或,
所以,如果修改的位数超过两位,或者不是简单的置为1,而是置为随机而定的数,
就可以先清零,后置1
可见下面代码:


```c
DEMO_CODE:
#include   "stdio.h"
int  main(void){

    int A=0x5a;

    A&=~(0x7<<0);        //简单的将3位清零
    printf("%0x\n",A);

    A|=(0x1<<1);         //将第二位置1
    printf("%0x\n",A);

    int B=0xabcd;
    B&=~(0xff<<0);      //将0到7这八位清零
    printf("%0x\n",B);


    B|=(0xab<<0);       //因为你上个清零操作,从0开始的这八位已经清零,
						//所以,把ab和全0的八位相或,结果还是ab
    printf("%0x\n",B);



}


你可能感兴趣的:(c语言)