【C语言】位运算符总结

位运算符一共有如下七个。
整数在计算机中用二进制的位来表示,C语言提供一些运算符可以直接操作整数中的位,称为位运算,这些运算符的操作数都必须是整型的。
在这里插入图片描述
——下面带大家分别来看看它们各自的含义与用法——

按位于运算符——&

按位与运算符“&”是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位都为1时,结果位才为1。参与运算的两个数均以补码出现。

 其所遵循的规则是:
     0&0=0                0&1=0
     1&0=0                1&1=1

例:

#include<stdio.h>
int main(void){
       int i=3;
       int j=5;
       k=i&j;
       printf("%d/n",k);
return 0;
}

其中现将i,j化为二进制:i=0011,j=0101。

运算过程:将二进制相同位置的数对齐,再分别进行按位与运算,如下。

0        0        1        1
&        &        &        &
0        1        0        1
||       ||       ||       ||
0        0        0        1

计算结果可得k=1

按位或运算符——|

按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。当参与运算的是负数时,参与两个数均以补码出现。

其所遵循的规则是:

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

例:

#include<stdio.h>
int main(void){
       int i=3;
       int j=5;
       k=i|j;
       printf("%d/n",k);
return 0;
}

其中现将i,j化为二进制:i=0011,j=0101。

运算过程:将二进制相同位置的数对齐,再分别进行按位与运算,如下。

0        0        1        1
|        |        |        |
0        1        0        1
||       ||       ||       ||
0        1        1        1

计算结果可得k=7

按位取反运算符——~

~i就是把i变量所有的二进制位取反。

例:

#include<stdio.h>
int main(void){
       int i=3;
       k=~i;
       printf("%d/n",k);
return 0;
}

其中现将i,j化为二进制:i=0011。
则~i=1100。

计算结果可得k=7

按位异或运算符——^

按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或。相同为0,不同为1。

其所遵循的规则是:

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

例:

#include<stdio.h>
int main(void){
       int i=3;
       int j=5;
       k=i^j;
       printf("%d/n",k);
return 0;
}

其中现将i,j化为二进制:i=0011,j=0101。

运算过程:将二进制相同位置的数对齐,再分别进行按位与运算,如下。

0        0        1        1
^        ^        ^        ^
0        1        0        1
||       ||       ||       ||
0        1        1        0

计算结果可得k=6

按位左移运算符——<<

左移运算符是一个计算机用语。用来将一个数的各二进制位全部左移若干位,移动的位数由右操作数指定,右操作数必须是非负值,其右边空出的位用0填补,高位左移溢出则舍弃该高位。

其所遵循的规则是:

i<<1  表示把i的所有二进制位左移一位,其右边空出的位用0填补。(左移n位相当于乘以2的n次方)

按位右移运算符——>>

右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位或者一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。(均由机器来定:这个不正确)(MSDN原文明确说明,右移对于无符号类型强制补0,对于有符号类型续补符号位)。

其所遵循的规则是:

i>>3  表示把i的所有二进制位右yi移3位,左边一般是0,当然也可能是1(数据不丢失的前提下,右移
n位相当于除以2的n次方)

应用举例

判断int型变量a是奇数还是偶数 a&1 = 0 偶数 a&1 = 1 奇数
取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
将int型变量a的第k位清0,即a=a&~(1<<k)
将int型变量a的第k位置1, 即a=a|(1<<k)
int型变量循环左移k次,即a=a<<k|a>>16-k (设sizeof(int)=16)
int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)

优点

C 语言位运算符在某些编程中如果灵活应用,则可以大大提高程序的执行效率,使程序执行时速度更高。[1]
而C 语言主要应用于嵌入式开发、智能电器、通信行业等一些对效率和时间都要求很高的应用领域中,学好位运算符,在程序开发中灵活应用位运算符,往往能在这些应用中起到事半功倍的效果。

位运算符使用的注意事项:[2]

(1) 位运算是对字节或字中的实际二进制位进行检测、设置或移位,它只适用于字符型和整数型变量以及它们的变体,对其它数据类型不适用。
(2)关系运算和逻辑运算表达式的结果只能是1 或0,而位运算的结果可以取0 或1 以外的值。
(3)要注意区别位运算符和逻辑运算符的不同。

                                            部分内容摘自百度百科及《郝斌C语言自学教程》
                   参考资料
                   [1]  吴红梅.C语言位运算符及其应用[J].科技信息(科学教研),2007(34):108-109.
                   [2]  谭浩强.《C 程序设计( 第二版) 》.清华大学出版社.1999.12
发布了33 篇原创文章 · 获赞 7 · 访问量 4566

猜你喜欢

转载自blog.csdn.net/qq_45239614/article/details/98182894