一个字节,包括了8位,可以对其中的8位的某一位进行读或者写;
比如char num=12,如果用十六进制表示,就是0x0C,如果二进制表示,就是0000 1010
位操作函数,主要这里介绍,位读和位写0,位写1,位取反,四个函数。
位读函数,是读取某个字节的数据的某一位,看是0还是1;
比如char num=0xAA,判断num的某个位是0还是1?
第二个函数,是位写函数。
将某个字节的某一位清0或者置1。
比如0000 1010,我将倒数第二个1改为0,其他位保持不变,那么就是成为0000 1000;
怎么实现呢?
第一个,位读函数
我们如何读取某一个位的数据呢?
返回的是当前位的数据,所以函数应该是有个返回值,返回值类型可以是char类型,因为结果只能是0或者1,也可用bit类型。
bit ReadBit(unsigned char readbytetemp);
比如我们a=ReadBit(num);
里面函数怎么实现呢?
位操作,必须涉及四个操作。
就是位或,位与,位取反,以及位异或。
介绍这四个操作。后面就能轻松理解。
位或操作有什么用。
或操作:
b=a或0,c=a或1。
如果a是0,则b=0,c=1;
如果a=1,则b=1,c=1.
结论:或1操作,将结果设置成为1,不管之前是什么数据,或1,则得到1。
或0,保持不变。
(或,有一个是真,那么就是真);
与操作:
b=a与0,c=a与1。
如果a是0,则b=0,c=0;
如果a=1,则b=0,c=1.
结论:与0,将某个数设置成为0;与1,保持数据不变;
异或操作。
b=a异或0,c=a异或1;
异或,相异就是真,两个不一样,就是结果就是真的。
如果a=0,则b=0,c=1;
如果a=1,则b=1,c=0;
结论:
异或0,保持不变,异或1,会将原来的取反。。
上面的理解之后,
- 如何编程位读函数呢?
首先将变量的bitnum右移bitnum位,那么左边的补0,右边的被挤出去。
第二步,与0x01,将倒数的哪一位b0位保持不变,因为与1,保持不变,与0操作,会清0.
结果得到0x0Y。
这个就是最后的结果如果Y是0,那么结果是0,如果Y=1,结果是1.
总结,
returnbit=(charnum>>bitnum)&0x01;
(bitnum范围是0,1,2,3,4,5,6,7)
得到函数。
unsigned char ReadBit(unsigned char datatemp,unsigned char bitnum)
{
return (datatemp>>bitnum)&0x01;
}
位写0函数。
如何将数据的某一位设置0,其他保持不变呢?
可以这么写。
也可以不用函数,不要把自己搞累了。
比如将0x1010 1110的某一位清0,
num=0xab,
将某一位清0,那么就是num =num的哪一位与0,其他位与1
num=num&0b11111110=num&0xFE,将bit0位清0了。
num=num&0b11111101=num&0xFD,将bit1位清0了。
位写1函数。
或0保持不变,或1会设置等于1
num=num|0b00000100=num|0x04,将bit4位置1了。
取反操作。将对应位和1进行异或就行了。其他和0异或保持不变。
num= num^0b00001000
=num^0x08,结果是其他位保持不变,bit3位取反了
。
你理解了吗?
蓝桥杯的单片机开发板中,LED灯,蜂鸣器,继电器,都需要这个操作哦。希望认真掌握这几个操作。
后面再反过来看看这篇文章吧。