/*
前提:unsigned char Byte;
1、把Byte的bit3置0。
答:
&:按位与
(1)、Byte = Byte & 0xf7;
(2)、Byte = Byte & ~(0x01<<3);
(3)、Byte &=~(0x01<<3);
以上三者效果相同。
原理:0&1是0,1&1是1;0&0是0,0&1是0。即任何数&1,结果都是其本身;任何数&0,结果都是0。
解释:0xf7除了bit3是0,其余位都是1,所以0xf7与Byte按位与,不会改变除bit3外的其余位,但是会将bit3置0;
延伸:把Byte的全部位都置0:Byte &= 0x00;把Byte的bit2、4、5都取反:Byte &= 0xCB;
2、把Byte的bit3置1。
答:
|:按位或
(1)、Byte = Byte | 0x08;
(2)、Byte = Byte | (0x01<<3);
(3)、Byte |= (0x01<<3);
以上三者效果相同。
原理:0|0是0,1|0是1;0|1是1,1|1是1。即任何数|0,结果都是其本身;任何数|1,结果都是1。
解释:0x08除了bit3是1,其余位都是0,所以0x08与Byte按位或,不会改变除bit3外的其余位,但是会将bit3置1;
延伸:把Byte的全部位都置1:Byte |= 0xff;把Byte的bit2、4、5都取反:Byte |= 0x34;
3、把Byte的bit3取反。
答:
^:异或
(1)、Byte = Byte ^ 0x08;
(2)、Byte = Byte ^ (0x01<<3);
(3)、Byte ^= (0x01<<3);
以上三者效果相同。
原理:0^0是0,1^0是1;0^1是1,1^1是0。即任何数^0,结果都是其本身;任何数^1,结果都是其相反。
解释:0x08除了bit3是1,其余位都是0,所以0x08与Byte按位异或,不会改变除bit3外的其余位,但是会将bit3取反;
延伸:把Byte的全部位都取反:Byte ^= 0xff;把Byte的bit2、4、5都取反:Byte ^= 0x34;
4、假设Byte为0-255任意一个值,用一句话实现,若值非0,赋值为1;若值为0,保持0。
答:
!!:双重取非
Byte = !!Byte;
原理:在多数C编译器中,0代表假,1代表真。对一个非0数取非,结果为0;对0取非,结果为1;对一个数双重取非,结果为其本身代表的逻辑状态(0/1)。
5、对Byte的二进制位全部取反
~:按位取反
Byte = ~Byte;
6、unsigned char Bit2; Bit2仅有两个值:0/1;
根据Bit的值把Byte的bit2置0/1(Bit2为1则置1,为0则置0)。
要求:用一句代码,且使用位运算。
(1)、Byte &=~(0x01<<2); //先把bit4置0
Byte |= (Bit2<<2); //(如果Bit值为1的话)再把bit置1;如果Bit值为0,则该句话无任何作用/影响,但上一句已经把bit置0了。
(2)、Byte = (Byte&~(0x01<<2))|(Bit2<<2);
以上两者效果相同。
7、有一变量Tmp,类型不定,值不定。
要求:若Tmp非0,把Byte的bit2置1;为0则置0。
(1)、Byte = (Tmp)? (Byte|0x04):(Byte&~0x04);
(2)、Byte = (Byte&~0x04)|((Tmp)? 0x04:0);
(3)、Byte = (Byte&~(0x01<<2))|(((unsigned char)(!!Tmp))<<2);
以上两者效果相同。