C语言-位运算知识总结及应用举例

一.按位与    &

假设两个二进制数的第i位分别为X,Y

如果X = 1且Y = 1,那么(X & Y) = 1,否则(X & Y) = 0.

例如有两个二进制数(0001 0111) 和( 0111 0001)

那么(0001 0111)&(0111 0001)=(0001 0001)

 按位与运算(&)应用举例:

1.让某一位或某些位为0: x & 0xFE(???? ???? & 1111 1110),也就是通过和FE进行按位的与运算,使得了x的最后一位变成了0.

2.取一个数中的一段:x & 0xFF(???? ???? & 1111 1111),也就是通过和FF进行按位的与运算,提取出了x中的后八位二进制数.


二.按位或     

假设两个二进制数的第i位分别为X,Y

如果X = 1或Y = 1,(X | Y) = 1,否则(X | Y) = 0.

例如有两个二进制数(0001 0111) 和( 0111 0001)

那么(0001 0111)|(0111 0001)=(0111 0111)

 按位或运算(|)应用举例:

1.使得一位或几位为1:x | 0x01(???? ???? & 0000 0001),也就是通过和01进行按位的或运算,使得了x的最后一位变成了1

2.把两个数拼起来:0x00FF|0xFF00=0xFFFF,通过或运算实现了两个数的连接


三.按位取反    ~

按位取反就是把一个二进制数的1变为0,0变为1,通过验证后可以发现取反也可以用二进制数1减去要取反的那个二进制数来实现.即

~(X) = 1 - X

这里要注意的是按位取反和求补码是有区别的,正数的补码与原码相同,这个就不说了.负数的补码:符号位为1,其余位为该数绝对值的原码按位取反,所以他们和取反是不一样的

按位取反(~)应用举例:

1.想得到全部为1的数:~0


四.按位异或    ^

假设两个二进制数的第i位分别为X,Y

如果X == Y,那么(X ^ Y) = 0 ,否则(X & Y) == 1.

按位异(^)应用举例:

1.使特定位的值取反:如对数10100001的第2位和第3位翻转,则可以将该数与0000 0110进行按位异或运算。 即(1010 0001)^(0000 0110)=1010 0111

2.不引入第三个变量实现两个数的交换:例如交换两个整数a,b的值,只需要三个表达式即可,a=a^b;b=a^b;a=a^b;,这种方法的效率相比于加减法交换和定义第三变量交换都要高,尤其是要处理许多数据时。


 五.左移    <<

假设一个二进制数为i,那么i<<j的意思是i中所有的位向左移动j个位置,而右边填入0

所有小于int的类型,移位以int的方式来做,结果是int。

左移(<<)应用举例:

1.x = x << 1等价于x = x * 2

2.x = x << n等价于x = x * 2^n



六.右移    >>

假设一个二进制数为i,那么i>>j的意思是i中所有的位向右移动j个位置,对于unsigned类型,左边填入0,对于signed类型,左边填入原来的最高位(保持符号不变)

右移(>>)应用举例:

1.x = x >> 1等价于x = x / 2

2.x = x >> n等价于x = x / 2^n


欢迎大家评论指正,谢谢◕‿◕

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值