位运算:能直接对二进制进行操作的运算符
1.左移:<<
[1]3<<1=6
/*
1.先将十进制的3,转换为二进制
2.左移1位,得出为6
*/
[1] 00000000 00000000 00000000 00000011 //3
0000000 00000000 00000000 000000110 //3<<1
//再来一个例子便能得出结论
[2]4<<2=16
//这道题不做过多介绍,通过例子[1]对左移都有了解了
[2] 00000000 00000000 00000000 00000100
000000 00000000 00000000 0000010000
结论:a<<b=a*2的b次幂。
2.右移:>>
//右移性质与左移类似,可以直接得出结论
结论:a>>b=a/2的b次幂。
2.2无符号右移:>>>
//对于>>>与>>之间,在数为正的情况下,用法一致。至于有什么不同, 先插入一个小知识
[1]~6+1=-6
/*
1.先将十进制的3,转换为二进制
2.将6取反后加1
*/
[1]00000000 00000000 00000000 00000110 //6
111111111 111111111 111111111 111111001 //~6
111111111 111111111 111111111 111111010 //~6+1=-6
结论:一个数的二进制最高位为0为正数,那么最高位为1为负数,怎么来的就是取反
并且a的负数就是~a+1
//那么穿插完了小知识,回到无符号右移,与右移的区别
[2]-6>>>2
/*
1.右移,原来是0,最高位补0,原来是1,最高位补1
2.无符号右移,不管原来是什么,最高位补0
*/
[2] 111111111 111111111 111111111 111111010
00111111111 111111111 111111111 1111110
3.取反:~
//这个没有什么可讲的,就是将0变成1,将1变成0
4.异或:^
[1]6^3=5
0110
^0011
0101
[2]6^3^3
0110
^0011
0101
^0011
0110
结论:a^b^b=a
[练习]在不存在第三方变量的情况下,交换两个变量的值。(答案在最下方,在往下翻前,可以先进行思考,自行尝试)
5.与:&
[1]6&2=2
0110
&0010
0010
[2]1(101 1)001
//在不确认某段二进制为0还是1的情况下,可用于取某段二进制的值
//比如我要取(1011),先无符号右移4位,再与上1111,就能得出
6.或:|
[1]6|3=7
0110
|0011
0111