原创:C里面的位运算符
作者 斯人 | 发布于 2012 年 1 月 6 日

位运算,经常糊涂,今天就系统的研究了一下

做下总结

所谓位运算 是直接对二进制进行操作

  • 与运算: 在编程中表示为&
  • 非运算: 在编程中表示为|
  • 异或运算:在编程中表示为^
  • 取反运算:在编程中表示为~
  • 左移运算:在编程中表示为<<
  • 右移运算:在编程中表示为>>

    1. 与运算,符号:&

什么是与运算:它由两个数,只有两个数都为1,最后的结果才为1.例如:

1 & 1==1

1 & 0==0

0 & 0==1

0 & 1==0

很明显,只有1和1相与,结果才为1

例如 1 的二进制为0001 ,2的二进制为0010 

     0001(1)

&   0010(2)

————-

     0000(0)

       那么  与(&) 到底有什么作用?

(1). 将所有二进制位清0 :

(2). 取指定位:

什么意思呢. 比如有一个二进制数 0100 1101,如果我们取2,4,6位

只要自己拼一个数 0101 0100 这样 , 0100 1101 的2,4,6位数就被保存了下来

如果我们想取 高4位或低4位 就可以用这个办法.

0101 0100

取低四位  : 只需要新数  低四位是1 就行了 0000 1111  这样就能取到低四位

取高四位  : 只需要新数  高四位是1 就行了 1111 0000 这样就能取高四位

2. 或运算 和 与运算相反,两个数只要有一个位是1,那么结果就是1.如

1 | 1==1

1 | 0==1

0 | 1==1

0 | 0==0

例如 二进制数 0000001 和0000010

    0000001 (1)

|  0000010 (2)

—————

    0000011 (3)

3. 异或运算符 ^

异或运算符 也有两个操作数,只要两个操作数 位不相同 返回结果就为1(真),如果相同 就为假

1 ^ 1==0

1 ^ 0==1

0 ^ 1==1

0 ^ 0==0

如:

    0000001(1)

^  0000010(2)

—————–

    0000011(3)

主要作用如下:

(1). 将一个二进制的特定位或指定为取反

如 一个二进制数 0000101  ,我们想全部取反 ,即0变成1,1变成0,只要将它与 1111111进行异或运算即可

    0000101

^  1111111

————–

    11111010

(2). 不用临时变量,就能将两个数交换

int a=1;

int b=2;

a=a^b; 运算如下:

      0000001(1)

^    0000010(2)

——————

       0000011(3)

然后 b=b^a

      0000010(2)

 ^   0000011(3)

—————

       0000001(1)

最后 a=a^b;

       0000011(3)

^    0000001(1)

——————

      0000010(2)

简化之后就是

 a=a^b;

b=b^a;

a=a^b;

(3) 与0 异或,值不变

10 ^0 操作如下:

     0000 1010

^   0000 0000

—————–

      0000 1010

未完 待续.

原文出处:http://www.imsiren.com/archives/169