C语言位运算知识

/*

前提: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);

以上两者效果相同。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值