C 位运算符与应用

位运算符列表:

&  按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0
|   按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1
^  按位异或 若参加运算的两个二进制位值相同则为0,否则为1
~  取反 ~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0
<< 左移 用来将一个数的各二进制位全部左移N位,右补0
>> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0

:下面内容提到的第几位都是从右边开始数。

1、“按位与” 运算符(&)的用途:

(1)清零

若原来的数中为1的位,新数中相应位为0,然后使二者进行&运算,即达到清零效果。

(2)取一个数中某些指定位

若有一个整数a(2byte)为00101100 10101100,想取其中的低字节,即

a&11111111==10101100

(3)保留指定位:

与一个数“按位与”运算,此数在改位取1,其余位取0

例如:二进制整数a为01010100,要把第6,5,4,2,1位保留下来就应该

a&00111011==00010000

(4)判断一个数是奇数还是偶数:

因为一个数 and 1的结果就是取二进制的最末位,

所以二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数

2、“按位或”运算符(|)的用途:

按位或运算常用来对一个数据的某些位定值为1,如:

二进制整数a为1010100,c为char字符型,若想使第6位改为1,则

(1)a|1110000即1110100

(2)c |= (1<<6);

:若想使第i 位改为0,则

void SetBit(char c,int i){
c
&= ~(1<<i); }

 3、交换两个值,不用临时变量

见代码:

#include <stdio.h>
int main()
{
    int a=3,b=4;
    a=a^b;
    printf("%d
",a);
    b=b^a;
    printf("%d
",b);
    a=a^b;
    printf("%d
",a);
    return 0;
}

Output

7
3
4

4“取反”运算符(~)

即用来求整数的二进制反码

5、“异或”运算符(^)

可以用来使第i位翻转,即0变成1,1变成0

void FlipBit(char *c, int i){
        c^=(1<<i);
    }

6、位运算与赋值运算符组成复合赋值运算符入,如:

&=,|=,>>=,<<=,^=

例子:

a &= b相当于 a = a&b

a <<=2 相当于 a = a<<2

 以上内容改编自:

http://blog.sina.com.cn/s/blog_60e96a410100mjd2.html 

祝你早日攒够失望,然后开始新的生活。
原文地址:https://www.cnblogs.com/LuRenJiang/p/6847314.html