C++位操作与、或、非、异或、取反详解

一、按位逻辑运算符

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;

概念:位字段?

猜你喜欢

转载自blog.csdn.net/daiyunxing0545/article/details/84312999