C++中的位运算符(抄袭苟的日常)

来源:互联网 发布:映客直播网站源码 编辑:程序博客网 时间:2024/05/23 23:08

程序中的所有数在计算机内存中都是以二进制的形式存储的。位运算就是直接对整数在内存中的二进制位进行操作

1、& 按位与

如果两个相应二进制位都为1,则结果为1,否则为0;

11 & 3=3

11 -- 00001011

&

3  --  00000011

= 00000011 = 3

应用技巧:

验证一个数是否被2整除

n%2==0    等同于   n & 1==0 :原因二进制位下,奇数的0号为都为1 偶数为0。1除了0号位为1,其他位都为0,一个数&1之后结果便可判断该数是否为偶数。


2、| 按位或

如果两个相应二进制位有一个为1,则结果为1,若都为0,则为0;

11 | 3 = 11

11 -- 00001011

|

3  --  00000011

= 00001011 = 11


应用:可以用一个int 的每个位来记录bool值(0或1),从而记录多个值。


3、 << 向左位移

二进制位下,每位向左移动给定的位数(右边补0)

11 << 1 = 22

00001011<<1

00010110 =22

移动n位,则数变成2的n次方倍。但可能造成溢出。


4、 >> 向右位移

二进制位下,每位向左移动给定的位数(右边补0)

11 >> 1 =5

00001011 >> 1

00000101 =5

右边位上的值直接被舍弃掉


5、^位异或

两个相应的二进制位上相同则为0,否则为1

11 ^ 3 =8

00001011

^

00000011

00001000=8


^运算通常用于对二进制的特定一位进行取反操作,^运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a^b)^b=a;

^运算可以用于简单加密,比如原始值int a = 19880516;密钥 int key =1314520; 进行加密 int data=key^a = 20665500;解密 data^key == a;

^运算还可以实现两个值得交换而不需要中间变量,例如:

void swap( int &a, int &b)

{

    a = a^b;

    b = a^b;

    a = a^b;

}


6、~取反运算

~运算的定义把内存中的0和1全部取反,所以~运算时要格外小心,你需要注意整数类型有没符号,如果~的对象是无符号整数(不能表示负数),那么他的值就是它与它的上界限的之差,因为无符号类型的数是用0x0000到0xFFFF依次表示的。

如果 ~的对象是有符号的整数,情况就不一样了。




0 0
原创粉丝点击