一.按位与 &
假设两个二进制数的第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
欢迎大家评论指正,谢谢◕‿◕