左移、右移
左移
<< 低位补 0
右移
>> 这是有符号右移。若值为正,则在高位插入0;若值为负,则在高位插入1。
>>> 则是无符号右移。无论正负,都在高位插入0。
特点:
1、不溢出情况下,右移相当于除 2
2、不溢出情况下,左移相当于乘 2
移位运算[速度]高于乘除运算
异或
两个相应位相同,则结果为0,否则为1。如下
10100001
^
00010001
=
10110000
总结
0 异或任何数 = 任何数
0^0=0
0^1=1
1 异或任何数 = 任何数取反
1^0=1
1^1=0
特点:
1、可以用来使某些特定的位翻转。
如对数 10100001 的第2位和第3位翻转,可以将数与 00000110 进行按位异或运算。
10100001
^
00000110
=
10100111
等价于 1010 0001 ^ 0x06
2、可以实现两个值的交换,而不必使用临时变量
a = 10100001
b = 00000110
交互 a、b 的值
a = a ^ b; // a = 10100111
b = a ^ b; // b = 10100001
a = a ^ b; // a = 00000110
3、数 a 两次异或同一个数 b(a=a^b^b)仍然为原值a.
或
两个相应位只要出现了 1 结果就为 1,否则为 0。如下
1000 0001
|
0001 1011
=
1001 1011
总结
0 或任何数(target目标位) = 任何数(target目标位)
0|0=0 --> 0 或 0 (该 0 表示的上述的任何数) 为 0
0|1=1 --> 0 或 1 (该 1 表示的上述的任何数) 为 1
1 或任何数 = 1
1|0=1
1|1=1
特点:
1、可以用于指定设置某几位的值为 1
如设置 1100 1010 1010 0000 的第 4、9、11 为 1
1100 1010 1010 0000
|
0000 0101 0000 1000
=
1100 1111 1010 1000
与
两个相应位都为 1 结果就为 1,否则为 0。如下
1000 0001 1001 0010
&
0001 1011 1111 1111
=
0000 0001 1001 0001
总结
1 与任何数(target目标位) = 任何数(target目标位)
1|0=0 --> 1 与 0 (该 0 表示的上述的任何数) 为 0
1|1=1 --> 1 与 1 (该 1 表示的上述的任何数) 为 1
0 与任何数(target目标位) = 0
总结一句话:当且仅当 1 与 1 才为 1,否则为 0
特点:
1、可以用于指定设置某几位的值为 0
如设置 1110 0100 1010 1000 的第 6、8、11 为 0
1110 0100 1010 1000
&
1011 1111 0101 1111
=
1010 0111 0101 1000
非
操作符为 ~
直接上例子
0000 0000 0000 0000 1000 0001
非操作结果为
1111 1111 1111 1111 0111 1110
0000 0000 0000 0000 0001 1011
非操作结果为
1111 1111 1111 1111 1110 0100
总结
一元运算符,位取反。
1 非 --> 0
0 非 --> 1