天天看点

C中的位运算

    • 按位与 &
    • 按位或 |
    • 异或 ^
    • 取反 ~
    • 左移运算符 <<
    • 右移运算符 >>

按位与 &

参加运算的两个数制,按二进制进行 与运算。如果两个相应的二进位数为1,刚该位的结果为 1 否则为 0

1 & 1 = 1;
0 & 0 = 0;
0 & 1 = 0;
1 & 0 = 0;

3 = 00000011
5 = 00000101
3&5=00000001 = 1;
           

如果参加 & 是负数(-3 & -5),则以补码形式表示为二进制数。然后按位进行 与 运算。 计算补码的方式见这篇博客

按位或 |

俩个相应的二进位只要有一个为1 则该位的结果就是1

| 0 = 0;
 | 0 = 1;
 | 1 = 1;
 | 1 = 1;
           

异或 ^

若参加运算的两个二进位同号,则结果为0,异号则为1。

^  = ;
 ^  = ;
 ^  = ;
 ^  = ;

a = a ^ b;  //可以用来交换a b的值
b = b ^ a;
a = a ^ b;
           

取反 ~

用来对二进制取反 即0变1 1变1

左移运算符 <<

用来将一个数的二进位全部左移若干位

左移一位相当于该数乘2

a = ;
a =  ;
a = a<<;
=>=   ==>a=
//整体左移位  右补
           

右移运算符 >>

将二进制位右移2位 移到右端的低位被舍弃

在右移时,需要注意符号位问题。对无符号数,右移时左边高位移入 0。对于有符号的值,如果原来符号位为 0 (该数为正),则左边也是移入 0,如果符号位原来为 1(该数为负),则左边移入的 0 还是 1 ,要取决于所用的计算机系统。移入 0 称为 逻辑右移,即简单右移。移入 1 称为 算术右移

右移一位相当于该数除以2

a =  >> ;(八进制表示)
a =   >> ;
a =  
           

不同长度的数据进行位运算时,如 a & b 而 a 为 long型,b 为 int 型。 系统会将二者按右端对齐;如果 b 为正数,则左侧 16 位补满 0。若 b 为负数,左端应补满 1。如果 b 为无符号整数型,则左侧补满 0。

参考:

http://www.cnblogs.com/qkhhxkj/archive/2011/06/29/2093894.html