一、按位逻辑运算符
1,按位取反~
如:~(10)结果位(01)
~var不会改变var的值,如果要改var值,可以为var=~var;
2,按位与&
有0得0,全1出1
var&=300等价于var=var&300
3,按位或|
有1出1,全0出0
var|=300等价于var=var|300
4,按位异或^
两者相等为0,不等为1
二、位逻辑运算符运用
1,用法:掩码(&)
按位与运算符常用于掩码(mask),可以获取某个位的状态
2,用法:打开位(设置位) (|)
有时必须打开其中某一位,其它位不变,这种情况可以采用按位或运算符
原理:因为使用|运算符,任何与0组合,结果都为本身;任何与1组合,结果都为1
例如:想把0xFE第0位置为1
则:0xFE|1=0xFF
3,用法:关闭位(清空位)(&、~)
有时必须关闭其中某一位,其它位不变,这种情况可以采用按位取反再与
原理:flags=flags&~Mask,Mask只要第一号位为1,其它都为0,所以,~Mask除1号为0,其它都为1
4,用法:切换位(^)
切换位是指改变原来的状态,开变为关,关变为开
原理:假设b为一个位,若b==1,则b^1=0;若b==0,则b^1=1
另外,无论b为0或者1,0^b均为b
所以,flags=flags^Mask; Mask位为1的切换,位为0的不变
5,用法:检查位
if((flags&Mask)==Mask)
{
TRACE(L"n位为1");
}
由于按位运算符的优先级比==低,所以必须加括号
为了避免信息漏过边界,掩码至少要与其覆盖的值宽度相同。
三、移位运算符
1,左移<<
(10001010)<<2//表达式
(00101000) //结果值
假设value为1,那么value<<2为4,但是value本身不变,仍为1
使用<<=来更改变量的值
value<<=2;//把value值改为4
2,右移>>
有符号类型右移结果取决于机器,这里以无符号为例子
(10001010)>>2//表达式
(00100010) //结果值
value>>=3;//右移后的结果赋值给value
3,移位运算符
number<<n; //number乘以2的n次幂
number>>n; //如果number为非负,则用number除以2的n次幂
这些移位运算符类似于十进制中移动小数点来乘以或除以10
运用:
#define BYTE_MASK 0xFF
unsigned long color = 0x002a162f;
unsigned char blue, green, red;
red = color&BYTE_MASK;
green = (color >> 8)&BYTE_MASK;
blue = (color >> 16)&BYTE_MASK;
概念:位字段?